HoangLong

 avatar
user_9175993
plain_text
a year ago
26 kB
17
Indexable
//HoangLong
//Ban Bong Bay
import java.util.Scanner;

public class Solution {
	static int[] map = new int[501];
	static int N, score, maxScore;

	public static void main(String[] args) throws Exception {
		//System.setIn(new FileInputStream("w2_thus/banbongbay/input.txt"));
		Scanner sc = new Scanner(System.in);

		int T = sc.nextInt();
		for (int tc = 1; tc <= T; tc++) {
			N = sc.nextInt();

			for (int i = 0; i < N; i++) {
				map[i] = sc.nextInt();
			}
			
			score = 0;
			maxScore = 0;
			backtrack(N, 0);

			System.out.println("Case #" + tc);
			System.out.println(maxScore);
		}
		sc.close();

	}

	private static void backtrack(int N, int score) {
		int max = -1, curI = 0;
		// dkkt
		if (N == 0) {
			maxScore = maxScore > score ? maxScore : score;
			return;
		}

		if (N == 2) {
			int temp = map[0];
			if (map[0] < map[1]) {
				temp = map[1];
			}
			backtrack(N - 2, score + 2 * temp);
		}

		if (N == 3) {
			int temp = map[0] * map[2];
			if (temp < map[1]) {
				backtrack(N - 3, score + 3 * map[1]);
			}
		}

		for (int i = 1; i < N - 1; i++) {
			int temp = map[i - 1] * map[i + 1];
			int save = map[i];

			for (int j = i; j < N - 1; j++) {
				map[j] = map[j + 1];
			}

			backtrack(N - 1, score + temp);

			for (int j = N - 2; j > i; j--) {
				map[j] = map[j - 1];
			}
			map[i] = save;
		}
	}
}
//Ho den
public class Test_1 {
	static int T, numberWhole; 
	static int pointX[], pointY[], value[][], min;
	static boolean visited[][];
	
	public static int calculatePoint(int x1, int x2, int y1, int y2){
		return ( Math.abs(x2-x1) + Math.abs(y2-y1) );
	}
	
	public static void backTrack(int r, int c, int sumTime){
		if(sumTime > min) return;
		
		if(min > sumTime + calculatePoint(r, pointX[numberWhole+1], c, pointY[numberWhole+1])){
			min = sumTime + calculatePoint(r, pointX[numberWhole+1], c, pointY[numberWhole+1]);
			return;
		}
		
		for(int i = 1; i <= numberWhole; i++){
			visited[value[i][0]][value[i][1]] = true;
			visited[value[i][2]][value[i][3]] = true;
			
			if(!visited[value[i][0]][value[i][1]]){
				backTrack(value[i][2], value[i][3],
						sumTime + value[i][4] + calculatePoint(r, value[i][0], c, value[i][1]));
			}
			
			if(!visited[value[i][2]][value[i][3]]){
				backTrack(value[i][0], value[i][1],
						sumTime + value[i][4] + calculatePoint(r, value[i][2], c, value[i][3]));
			}
			
			visited[value[i][0]][value[i][1]] = false;
			visited[value[i][2]][value[i][3]] = false;
			
		}
	}
	
	public static void main(String[] args) throws FileNotFoundException{
		System.setIn(new FileInputStream("Test_1"));
		Scanner scanner = new Scanner(System.in);
		T = scanner.nextInt();
		for(int tc = 1; tc <= T; tc++){
			numberWhole = scanner.nextInt();
			pointX = new int[numberWhole+2];
			pointY = new int[numberWhole+2];
			pointX[0] = scanner.nextInt();
			pointY[0] = scanner.nextInt();
			pointX[numberWhole+1] = scanner.nextInt();
			pointY[numberWhole+1] = scanner.nextInt();
			
			value = new int[numberWhole+1][5];
			
			for(int i = 1; i <= numberWhole; i++){
				value[i][0] = scanner.nextInt();
				value[i][1] = scanner.nextInt();
				value[i][2] = scanner.nextInt();
				value[i][3] = scanner.nextInt();
				value[i][4] = scanner.nextInt();
			}
			
			visited = new boolean[1001][1001];
			min = calculatePoint(pointX[0], pointX[numberWhole+1],
					pointY[0], pointY[numberWhole+1]);
			
			visited[pointX[0]][pointY[0]] = true;
			backTrack( pointX[0], pointY[0], 0);
			System.out.println("#" + tc + " " + min);
			
		}
	}

}
//Hugo ve nha
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class HugoVeNha {
    static int N;
    static int gate[][];
    static int res;
    static int armyAtGate[], expAtGate[];

    static void BT(int k, int cost){
        if(k == N){
            res = res < cost ? res : cost;
            return;
        }
        if(cost > res)
            return;

        //Pass
        BT(k+1, cost + gate[k][1]);

        //Hire
        armyAtGate[k] += gate[k][0];
        BT(k+1, cost + gate[k][1]*2);
        armyAtGate[k] -= gate[k][0];
        
        //Combat
        int total = 0;
        int tmp_army[] = new int[21];
        int tmp_exp[] = new int[21];
        for(int i = 0; i < k; i++){
            tmp_army[i] = armyAtGate[i];
            tmp_exp[i] = expAtGate[i];

            if(armyAtGate[i] > 0 && expAtGate[i] < 3){
                total += armyAtGate[i];
            }
        }

        int enermy = gate[k][0];
        if(total < enermy)
            return;

        for(int i = 0; i < k; i++){
            if(armyAtGate[i] <= 0 || expAtGate[i] >= 3)
                continue;
            int tmp_enermy = enermy;
            enermy -= armyAtGate[i];
            armyAtGate[i] -= tmp_enermy;    
            if(enermy <= 0)
            break;
        }

        for(int i = 0; i < k; i++){
            if(armyAtGate[i] > 0 || expAtGate[i] < 3)
                expAtGate[i] += 1;
        }
        
        BT(k+1, cost);

        for(int i = 0; i < k; i++){
            armyAtGate[i] = tmp_army[i];
            expAtGate[i] = tmp_exp[i];
        }
    }

    public static void main(String[] args) {
        try {
            System.setIn(new FileInputStream("input_HugoVeNha.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        Scanner sc = new Scanner(System.in);

        int T = sc.nextInt();
        for(int t = 1; t <= T; t++){
            N = sc.nextInt();
            gate = new int[21][2];
            for(int i = 0; i < N; i++){
                gate[i][0] = sc.nextInt();
                gate[i][1] = sc.nextInt();
            }

        //Solve
        res = 999999;
        armyAtGate = new int[21];
        expAtGate = new int[21];
        BT(0, 0);

        System.out.println("#" + t + " " + res);
        }
    }
}
//Hugo thi chay
public class Solution {
	static int m, d;
	static int []gio, phut, nangLuong, time;
	static int timeMin;

	public static void backtrack(int k, int energy, int tg, int km){
		if(tg > timeMin){
			return;
		}
		if(energy <= 0){
			return;
		}
		if(k >= 5){
			return;
		}
		if(km <= 0){
			if(tg < timeMin){
				timeMin = tg;
			}
			return;
		}

		for(int j=0; j<2; j++){
			if(j == 1){
				backtrack(k+1, energy-nangLuong[k], tg + time[k], km-1);
				backtrack(k, energy-nangLuong[k], tg + time[k], km-1);
			}
			else{
				backtrack(k+1, energy, tg, km);
			}
		}	
	}
	
	public static void main(String[] args) {
		try {
			System.setIn(new FileInputStream("src/hugo_thi_chay/input.txt"));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Scanner scanner = new Scanner(System.in);
		int TC = scanner.nextInt();
		for(int t=0; t<TC; t++){
			m = scanner.nextInt();
			d = scanner.nextInt();
			gio = new int[5];
			phut = new int[5];
			nangLuong = new int[5];
			time = new int[5];
			for(int i=0; i<5; i++){
				gio[i] = scanner.nextInt();
				phut[i] = scanner.nextInt();
				nangLuong[i] = scanner.nextInt();
			}
			for(int i=0; i<5; i++){
				time[i] = gio[i] * 60 + phut[i];
			}
		
			timeMin = Integer.MAX_VALUE;
			backtrack(0, m, 0, d);
			System.out.println("Case #" + (t+1));
			if(timeMin == Integer.MAX_VALUE){
				System.out.println(-1);
			}
			else{
				int resGio = timeMin / 60;
				int resPhut = timeMin % 60;
				System.out.println(resGio + " " + resPhut);
			}
			
		}
	}
}
//Hugo giao hang
public class hugo_giao_hang {
	static int hx, hy, sx, sy, n, Ans;
	static int [][] arr, map;
	static int [] visit;
	
	static int distance(int i, int j) {
		int a = arr[i][0] - arr[j][0];
		int b = arr[i][1] - arr[j][1];
		if (a < 0) a = 0 - a;
		if (b < 0) b = 0 - b;
		return a+b;
	}
	
	
	static void createMatrix() {
		for (int i = 0; i < n + 2; i++) {
			for (int j = 0; j < n + 2; j++) {
				int x = distance(i, j);
				map[i][j] = x;
			}
		}
	}
	
	static void Try(int x, int sum_distance, int count) {
		if (count == n) {
			sum_distance += map[x][n+1];
			if (sum_distance < Ans) Ans = sum_distance;
			return;
		}
		if (Ans < sum_distance) return;
		for (int i = 1; i <= n; i++) {
			if (visit[i] == 0) {
				visit[i] = 1;
				Try(i, sum_distance + map[x][i], count+1);
				visit[i] = 0;
			}
		}
	}
	
	
	
	public static void main(String[] args) throws Exception{
		System.setIn(new FileInputStream("D://Trainee//SRV_training//src//Hugo_Giao_Hang//giao_hang.txt"));
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for (int test_case = 1; test_case <= T; test_case++) {
			sx = sc.nextInt();
			sy = sc.nextInt();
			hx = sc.nextInt();
			hy = sc.nextInt();
			n = sc.nextInt();
			arr = new int [n+2][2];
			for(int i = 1; i < n+1; i++) {
				arr[i][0] = sc.nextInt();
				arr[i][1] = sc.nextInt();
			}
			arr[0][0] = sx;
			arr[0][1] = sy;
			arr[n+1][0] = hx;
			arr[n+1][1] = hy;
			map = new int [n+2][n+2];
			createMatrix();
			Ans = 1000000000;
			visit = new int [n+2];
			visit[0] = 1;
			Try(0, 0, 0);
			
			
			System.out.println("Case #" + test_case + " " + Ans);
		}
	}
}
//hugo xep lich
public class xep_quang_cao {
	static int N, res, start, end;
	static int[][] guestTime;
	static int[][] score = new int[3][55];
	static int[] L = new int[3];
	static int[] P = new int[3];
	static int[] visit_ads;

	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("w4_fri/xep_quang_cao/input.txt"));
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for (int tc = 1; tc <= T; tc++) {
			N = sc.nextInt();
			for (int i = 0; i < 3; i++) {
				L[i] = sc.nextInt();
			}
			for (int i = 0; i < 3; i++) {
				P[i] = sc.nextInt();
			}
			guestTime = new int[N][2];
			visit_ads = new int[101];

			for (int i = 0; i < N; i++) {
				guestTime[i][0] = sc.nextInt();
				guestTime[i][1] = sc.nextInt() + guestTime[i][0];
			}
			start = guestTime[0][0];
			end = guestTime[0][1];
			for (int i = 1; i < N; i++) {
				if (start > guestTime[i][0]) {
					start = guestTime[i][0];
				}
				if (end < guestTime[i][1]) {
					end = guestTime[i][1];
				}
			}
			res = -1;

			backtrack(0);

			System.out.println("Case #" + tc);
			System.out.println(res);
		}
	}

	private static boolean checkVisit(int start, int end) {
		for (int i = start; i < end; i++) {
			if (visit_ads[i] == 1)
				return false;
		}
		return true;
	}

	private static void visit(int start, int end, int visit) {
		for (int i = start; i < end; i++) {
			visit_ads[i] = visit;
		}
	}

	private static void backtrack(int k) {
		if (k == 3) {
			int count = sum();
			res = count > res ? count : res;
			return;
		}
		for (int i = 1; i <= 50; i++) {
			if (checkVisit(i, i + L[k])) {
				visit(i, i + L[k], 1);

				// Neu ads nam trong thoi gian cua guest thi tinh diem
				for (int j = 0; j < N; j++) {
					if (i >= guestTime[j][0] && i + L[k] <= guestTime[j][1])
						score[k][j] = P[k];
				}

				backtrack(k + 1);

				visit(i, i + L[k], 0);

				for (int j = 0; j < N; j++) {
					if (i >= guestTime[j][0] && i + L[k] <= guestTime[j][1])
						score[k][j] = 0;
				}
			}

		}
	}

	private static int sum() {
		int count = 0;
		for (int i = 0; i < N; i++) {
			int max = score[0][i];
			for (int j = 1; j < 3; j++)
				if (max < score[j][i])
					max = score[j][i];
			count += max;
		}
		return count;
	}
}
//Hugo ban dau
#include<iostream>
using namespace std;
int N, M;
int P; // giới hạn bơm
// mảng 8 loại đường ống
int DuongOng[8][4]={
	0,0,0,0,
	1,1,1,1,
	1,0,1,0,
	0,1,0,1,
	1,1,0,0,
	0,1,1,0,
	0,0,1,1,
	1,0,0,1 };

int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};

int visit[51][51]; // mảng thăm
int cntN[51][51]; // mảng lan truyền
int map[51][51]; // mang đường ống
int Qx[10000];
int Qy[10000];
int rear, front;
int cnt; //đếm số đường ống 

bool check(int x, int y){
	if(x >= 0 && x < N && y >= 0 && y < M)return true;
	return false;
}
void BFS(int x_mb, int y_mb){
	front = rear = 0;
	Qx[rear] = x_mb;
	Qy[rear++] = y_mb;
	visit[x_mb][y_mb] = 1;
	cntN[x_mb][y_mb] = 1;
	while (front < rear){
		int x = Qx[front];
		int y = Qy[front++];
		for (int i = 0; i < 4; i++){
			int nx = x + dx[i]; // vị trí sắp đi đến
			int ny = y + dy[i];
			if(check(nx, ny)) // check vị trí sắp đi đến
			{
				if(map[nx][ny] != 0 && visit[nx][ny] == 0 && DuongOng[map[x][y]][i] == 1 && DuongOng[map[nx][ny]][(i+2)%4] == 1)
				{ // nếu vị trí sắp tới khác 0, chưa thăm, đầu của 2 loại ống phù hợp nhau
					cntN[nx][ny] = cntN[x][y] + 1; // lan truyền giới hạn bơm 
					if(cntN[nx][ny] > P)return;
					cnt++;
					Qx[rear] = nx;
					Qy[rear++] = ny;
					visit[nx][ny] = 1;
				}
			}
		}
	}
}
void reset(){
	for (int i = 0; i <= N; i++){
		for (int j = 0; j <= M; j++){
			visit[i][j] = 0;
			cntN[i][j] = 0;
		}
	}
}

int main(){
	int T;
	int x_mb,y_mb;
	freopen("input.txt", "r", stdin);
	cin>>T;
	for (int tc = 1; tc <= T; tc++)
	{
		cnt = 1;
		cin>>N>>M>>x_mb>>y_mb>>P;
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < M; j++)
			{
				cin>>map[i][j];
			}
		}
		reset();
		BFS(x_mb,y_mb);
		cout<<"Case #"<<tc<<endl;
		cout<<cnt<<endl;
	}
	return 0;
}
//HUgo quan ly tau
#include <iostream>

using namespace std;

int N; // Số lượng người trong dãy
int people[1001], door[4], kc[4][1001], check[5], visit[1001]; // Mảng lưu thông tin về người, cửa, khoảng cách, kiểm tra và viếng thăm
int Max; // Biến lưu trữ kết quả tối ưu

// Hàm in mảng khoảng cách
void print(int kc[]) {
    for (int i = 1; i <= N; i++) {
        cout << kc[i] << " ";
    }
    cout << endl;
}

int abs(int x){
	return x > 0 ? x : -x;
}

// Hàm backtrack để thực hiện quay lui
void backtrack(int indext, int sum) {
    // Nếu đã duyệt hết 4 cửa
    if (indext == 4) {
        // Lưu kết quả tối ưu
        Max = min(Max, sum);
        return;
    }
    // Duyệt qua từng cửa
    for (int s = 1; s <= 3; s++) {
        // Nếu chưa kiểm tra cửa này
        if (check[s] == 0) {
            // Duyệt qua 2 trường hợp: mở cửa hoặc không mở
            for (int k = 0; k < 2; k++) {
                int dor = door[s]; // Cửa hiện tại
                int guse = people[dor]; // Số người ở cửa đó
                int cout = 0; // Biến đếm số lần di chuyển
                int value = 0; // Biến lưu tổng khoảng cách
                // Trường hợp mở cửa
                if (k == 0) {
                    check[s] = 1;
                    while (guse > 0) {
                        int l = dor - cout; // Cửa bên trái
                        int r = dor + cout; // Cửa bên phải
                        // Nếu cửa bên trái hợp lệ và chưa được viếng thăm
                        if (l >= 1 && visit[l] == 0) {
                            visit[l] = dor;
                            value = value + cout + 1; // Cập nhật tổng khoảng cách
                            guse--; // Giảm số người cần di chuyển
                        }
                        // Nếu cửa bên phải hợp lệ và chưa được viếng thăm
                        else if (r <= N && visit[r] == 0) {
                            visit[r] = dor;
                            value = value + cout + 1; // Cập nhật tổng khoảng cách
                            guse--; // Giảm số người cần di chuyển
                        }
                        // Nếu cửa đã được viếng thăm hoặc vượt quá phạm vi
                        else if ((r <= N && visit[r] != 0) || (l >= 1 && visit[l] != 0)) {
                            cout++; // Tăng biến đếm
                        }
                    }
                    // Gọi đệ quy cho cửa tiếp theo
                    backtrack(indext + 1, sum + value);
                    check[s] = 0; // Đánh dấu cửa đã được kiểm tra
                    // Đặt lại các cửa đã được viếng thăm
                    for (int i = 1; i <= N; i++) {
                        if (visit[i] == dor)
                            visit[i] = 0;
                    }
                } 
                // Trường hợp không mở cửa
                else {
                    check[s] = 1;
                    while (guse > 0) {
                        int l = dor - cout; // Cửa bên trái
                        int r = dor + cout; // Cửa bên phải
                        if (r <= N && visit[r] == 0) { // Nếu cửa bên phải hợp lệ và chưa được viếng thăm
                            visit[r] = dor;
                            value = value + cout + 1;
                            guse--;
                        }
                        else if (l >= 1 && visit[l] == 0) { // Nếu cửa bên trái hợp lệ và chưa được viếng thăm
                            visit[l] = dor;
                            value = value + cout + 1;
                            guse--;
                        } else {
                            cout++;
                        }
                    }
					// Gọi đệ quy cho cửa tiếp theo
                    backtrack(indext + 1, sum + value);
                    check[s] = 0; // Đánh dấu cửa đã được kiểm tra
					// Đặt lại các cửa đã được viếng thăm 
                    for (int i = 1; i <= N; i++) {
                        if (visit[i] == dor)
                            visit[i] = 0;
                    }
                }
            }
        }
    }
}

int main() {
	//freopen("HugoQuanLy.txt", "r", stdin);
    int T;
    cin >> T; // Nhập số lượng bộ test
    for (int t = 1; t <= T; t++) {
        cin >> N; // Nhập số lượng người trong dãy
        // Nhập thông tin về cửa và số người ở mỗi cửa
        for (int i = 1; i <= 3; i++) {
            int x;
            cin >> x;
            door[i] = x;
            cin >> people[x];
        }
        // Tính toán khoảng cách từ mỗi cửa đến từng người
        for (int i = 1; i <= 3; i++) {
            int k = door[i];
            for (int j = 1; j <= N; j++) {
                kc[i][j] = abs(k - j) + 1;
            }
        }
        Max = 10000; // Khởi tạo kết quả tối ưu
        backtrack(1, 0); // Gọi hàm backtrack để tìm kết quả tối ưu
        // In kết quả
        cout << "Case #" << t << endl;
        cout << Max << endl;
    }

    return 0;
}
//Thong tri khu vuc
#include<iostream>
using namespace std;
// code 100/100
int map[105][105];
int mapCopy[105][105];
int visit[105][105];
int Que[10000][2];
int n, ans, T;
int TS[6]; // mảng lưu tần số xuất hiện của các số
int dx[] = { 0, -1, 0, 1 };
int dy[] = { -1,0, 1,0 };
void reset() {
	for (int i = 0; i < 6; i++)  TS[i] = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) visit[i][j] = 0;
	}
}
void dfs(int x, int y, int oVal, int nVal) {           // Tô màu cho cửa hàng
	for (int h = 0; h < 4; h++) {
		int nx = x + dx[h];
		int ny = y + dy[h];
		if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
		if (!visit[nx][ny] && mapCopy[nx][ny] == oVal) {
			visit[nx][ny] = 1;
			mapCopy[nx][ny] = nVal;
			dfs(nx, ny, oVal, nVal);
		}
	}
}
void bfs(int x, int y) {
	reset();
	visit[x][y] = 1;
	int front = 0, rear = 0;
	Que[rear][0] = x; // push vị trí đầu vào Queue
	Que[rear++][1] = y;
	while (front < rear) {
		int r = Que[front][0]; // vị trí đang đứng
		int c = Que[front++][1];
		for (int h = 0; h < 4; h++) {
			int nx = r + dx[h]; // vị trí sắp đến
			int ny = c + dy[h];
			if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue; // check vị trí sắp đến
			if (!visit[nx][ny]) { // nếu vị trí sắp tới chưa được thăm
				if ((map[r][c] == 0) || (map[nx][ny] == map[r][c])) {
					TS[map[nx][ny]] ++;                    // Tăng tần số xuất hiện cho số đó 
					visit[nx][ny] = 1; // đánh dấu
					Que[rear][0] = nx; // push số đó vào Queue
					Que[rear++][1] = ny;
				}
			}
		}
	}
	int maxTS = TS[1], color = 1;
	for (int i = 2; i <= 5; i++)
		if (TS[i] >= maxTS) {              // Chọn ra số có tần số xuất hiện nhiều nhât
			color = i;
			maxTS = TS[i];
		}
		mapCopy[x][y] = color;
		dfs(x, y, 0, color);
}
void solve() {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (mapCopy[i][j] == 0) {
				bfs(i, j);
			}
		}
	}
	reset();
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (!visit[i][j]) {                      // Tìm số vùng
				ans++; 
				visit[i][j] = 1;
				dfs(i, j, mapCopy[i][j], mapCopy[i][j]);
			}
		}
	}
}
int main() {
	freopen("input.txt", "r", stdin);
	cin >> T;
	for (int tc = 1; tc <= T; tc++) {
		cin >> n;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				cin >> map[i][j];
				mapCopy[i][j] = map[i][j];
			}
		}
		ans = 0; solve();
		cout << "Case #" << tc << endl << ans << endl;
	}
	return 0;
}
//Cleaning robot
#include<iostream>

using namespace std;

int M[101][101];
int visited[101][101];
int A[2][100];
int idx;
int ke[101][101];
int S[2][1000000];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int n,m;
int top;
int bot;
int luu[11];
int used[11];
int minn,kq;

bool checkused()
{
	for(int i=0;i<idx;i++)
	{
		if(used[i]==0) return true;
	}
	return false;
}

void tinhtoan(int x)
{
	if(kq>minn) return;
	if(!checkused())
	{
		if(kq<minn) minn=kq;
		return;
	}
	for(int i=0;i<idx;i++)
	{
		if(used[i]==0)
		{
			kq+=ke[x][i];
			used[i]=1;
			tinhtoan(i);
			used[i]=0;
			kq-=ke[x][i];
		}
	}
}

int main()
{
	//freopen("input.txt","r",stdin);
	int t;cin>>t;
	
	for(int tc=1;tc<=t;tc++)
	{
		idx=1;
		cin>>n>>m;
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				cin>>M[i][j];
				if(M[i][j]==3)
				{
					A[0][0]=i;
					A[1][0]=j;
				}
				else if(M[i][j]==1)
				{
					A[0][idx]=i;
					A[1][idx]=j;
					idx++;
				}
			}
		}
		// xu ly
		for(int i=0;i<101;i++)
			for(int j=0;j<101;j++) ke[i][j]=0;
		//
		int dem=0;
		bool firstcheck=true;
		for(int i=0;i<idx;i++)
		{
			for(int a=0;a<101;a++)
				for(int b=0;b<101;b++) visited[a][b]=0; 
			//khai bao queue
			top=-1,bot=-1;
			//
			top++;
			S[0][top]=A[0][i];
			S[1][top]=A[1][i];
			visited[A[0][i]][A[1][i]]=1;
			//
			while(top!=bot)
			{
				bot++;
				int x=S[0][bot];
				int y=S[1][bot];
				//
				for(int k=0;k<4;k++)
				{
					int xnew=x+dx[k];
					int ynew=y+dy[k];
					if(xnew >=0 && xnew <n && ynew >= 0 && ynew<m)
					{
						if(visited[xnew][ynew]==0 && M[xnew][ynew]!=2)
						{
							top++;
							S[0][top]=xnew;
							S[1][top]=ynew;
							visited[xnew][ynew]=visited[x][y]+1;
						}
					}
				}
			}
			//dua vao ma tran ke
			for(int a=0;a<idx;a++)
			{
				ke[i][a]=visited[A[0][a]][A[1][a]]-1;
				if(ke[i][a]==-1) firstcheck=false;
			}
			if(firstcheck) dem++;
		}
		if(dem<idx)
        {
            cout<<"Case #"<<tc<<endl<<-1<<endl;
        	continue;
        }
         minn=9999;kq=0;
		for(int k=0;k<11;k++) used[k]=0;
		//
		tinhtoan(0);
		//
		cout<<"Case #"<<tc<<endl;
		cout<<minn<<endl;
	}
	return 0;
}
//Ho den
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Test_1 {
	static int T, numberWhole; 
	static int pointX[], pointY[], value[][], min;
	static boolean visited[][];
	
	public static int calculatePoint(int x1, int x2, int y1, int y2){
		return ( Math.abs(x2-x1) + Math.abs(y2-y1) );
	}
	
	public static void backTrack(int r, int c, int sumTime){
		if(sumTime > min) return;
		
		if(min > sumTime + calculatePoint(r, pointX[numberWhole+1], c, pointY[numberWhole+1])){
			min = sumTime + calculatePoint(r, pointX[numberWhole+1], c, pointY[numberWhole+1]);
			return;
		}
		
		for(int i = 1; i <= numberWhole; i++){
			visited[value[i][0]][value[i][1]] = true;
			visited[value[i][2]][value[i][3]] = true;
			
			if(!visited[value[i][0]][value[i][1]]){
				backTrack(value[i][2], value[i][3],
						sumTime + value[i][4] + calculatePoint(r, value[i][0], c, value[i][1]));
			}
			
			if(!visited[value[i][2]][value[i][3]]){
				backTrack(value[i][0], value[i][1],
						sumTime + value[i][4] + calculatePoint(r, value[i][2], c, value[i][3]));
			}
			
			visited[value[i][0]][value[i][1]] = false;
			visited[value[i][2]][value[i][3]] = false;
			
		}
	}
	
	public static void main(String[] args) throws FileNotFoundException{
		System.setIn(new FileInputStream("Test_1"));
		Scanner scanner = new Scanner(System.in);
		T = scanner.nextInt();
		for(int tc = 1; tc <= T; tc++){
			numberWhole = scanner.nextInt();
			pointX = new int[numberWhole+2];
			pointY = new int[numberWhole+2];
			pointX[0] = scanner.nextInt();
			pointY[0] = scanner.nextInt();
			pointX[numberWhole+1] = scanner.nextInt();
			pointY[numberWhole+1] = scanner.nextInt();
			
			value = new int[numberWhole+1][5];
			
			for(int i = 1; i <= numberWhole; i++){
				value[i][0] = scanner.nextInt();
				value[i][1] = scanner.nextInt();
				value[i][2] = scanner.nextInt();
				value[i][3] = scanner.nextInt();
				value[i][4] = scanner.nextInt();
			}
			
			visited = new boolean[1001][1001];
			min = calculatePoint(pointX[0], pointX[numberWhole+1],
					pointY[0], pointY[numberWhole+1]);
			
			visited[pointX[0]][pointY[0]] = true;
			backTrack( pointX[0], pointY[0], 0);
			System.out.println("#" + tc + " " + min);
			
		}
	}

}

Editor is loading...
Leave a Comment