HoangLong2

 avatar
user_9175993
plain_text
a year ago
43 kB
32
Indexable
//HoangLong2
//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);
			
		}
	}

}
//Cuting a piece
import java.util.Scanner;

public class PaperCutting {

    // Hàm đệ quy để đếm số lượng giấy trắng và xanh
    static int[] countColoredPieces(int[][] paper, int x, int y, int size) {
        if (isUniform(paper, x, y, size)) {
            if (paper[x][y] == 0) {
                return new int[]{1, 0}; // {white, blue}
            } else {
                return new int[]{0, 1}; // {white, blue}
            }
        } else {
            int newSize = size / 2;
            int[] count1 = countColoredPieces(paper, x, y, newSize);
            int[] count2 = countColoredPieces(paper, x, y + newSize, newSize);
            int[] count3 = countColoredPieces(paper, x + newSize, y, newSize);
            int[] count4 = countColoredPieces(paper, x + newSize, y + newSize, newSize);

            return new int[]{
                count1[0] + count2[0] + count3[0] + count4[0],
                count1[1] + count2[1] + count3[1] + count4[1]
            };
        }
    }

    // Hàm kiểm tra nếu tất cả các phần của giấy có cùng màu
    static boolean isUniform(int[][] paper, int x, int y, int size) {
        int color = paper[x][y];
        for (int i = x; i < x + size; i++) {
            for (int j = y; j < y + size; j++) {
                if (paper[i][j] != color) {
                    return false;
                }
            }
        }
        return true;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();

        for (int t = 1; t <= T; t++) {
            int N = sc.nextInt();
            int[][] paper = new int[N][N];

            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    paper[i][j] = sc.nextInt();
                }
            }

            int[] result = countColoredPieces(paper, 0, 0, N);
            System.out.println("Case #" + t);
            System.out.println(result[0] + " " + result[1]);
        }
        sc.close();
    }
}
//Skyforce
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

using namespace std;
#define SIZE 15

int map[SIZE][SIZE];
int N;
int best;

void resetData() {
	int i, j;
	best = -1;
	for (i = 0; i < SIZE; ++i) {
		for (j = 0; j < 5; ++j) {
			map[i][j] = 0;
		}
	}
}

void move(int row, int col, int coin, int ignoreEnemy, bool have_bomb) {
	if (col < 0 || col > 4) return;

	if (row < 0) {
		if (best < coin) best = coin;
		return;
	}

	//process current cell
	if (map[row][col] == 1) {
		++coin;
	}
	else if (map[row][col] == 2 && ignoreEnemy <= 0) {
		if (coin > 0) --coin;
		else return;
	}

	//scroll down bombed area
	--ignoreEnemy;

	//move up
	move(row - 1, col, coin, ignoreEnemy, have_bomb);

	//use bomb and move up
	if (have_bomb) move(row - 1, col, coin, 5, false);

	//move top-left
	move(row - 1, col - 1, coin, ignoreEnemy, have_bomb);

	//use bomb and move top-left
	if (have_bomb) move(row - 1, col - 1, coin, 5, false);

	//move top-right
	move(row - 1, col + 1, coin, ignoreEnemy, have_bomb);

	//use bomb and move top-right
	if (have_bomb) move(row - 1, col + 1, coin, 5, false);
}

int main() {
	int T, testcase;
	cin>>T;
	for (testcase = 1; testcase <= T; ++testcase) {
		cin>>N;
		resetData();
		int i, j, k;
		for (i = 0; i < N; ++i) {
			for (j = 0; j < 5; ++j) {
				cin>>map[i][j];
			}
		}

		move(N, 2, 0, 0, true);
		cout<<"Case #"<<testcase<<endl;
		cout<<best<<endl;
	}
	return 0;
}
//Hugo di tau

#include <iostream>

using namespace std;

// Hàm để tính tổng khoảng cách di chuyển của hành khách từ một cửa
int calculateDistance(int N, int startPos, int numPassengers, bool seats[]) {
    int totalDistance = 0;
    for (int i = 0; i < numPassengers; ++i) {
        int distance = 0;
        while (true) {
            // Kiểm tra vị trí ngồi tại startPos
            if (startPos + distance < N && !seats[startPos + distance]) {
                totalDistance += distance + 1;
                seats[startPos + distance] = true;
                break;
            }
            if (startPos - distance >= 0 && !seats[startPos - distance]) {
                totalDistance += distance + 1;
                seats[startPos - distance] = true;
                break;
            }
            distance++;
        }
    }
    return totalDistance;
}

// Hàm để tìm tất cả các hoán vị của mảng
bool nextPermutation(int arr[], int size) {
    int i = size - 2;
    while (i >= 0 && arr[i] >= arr[i + 1]) {
        i--;
    }
    if (i < 0) return false;
    int j = size - 1;
    while (arr[j] <= arr[i]) {
        j--;
    }
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
    for (int k = i + 1, l = size - 1; k < l; k++, l--) {
        temp = arr[k];
        arr[k] = arr[l];
        arr[l] = temp;
    }
    return true;
}

int main() {
	freopen("inp.txt", "r", stdin);
    int T;
    cin >> T;
    
    for (int caseNum = 1; caseNum <= T; ++caseNum) {
        int N;
        cin >> N;
        
        int positions[3], passengers[3];
        for (int i = 0; i < 3; ++i) {
            cin >> positions[i] >> passengers[i];
            positions[i]--; // Để vị trí bắt đầu từ 0
        }
        
        int minDistance = 999999; // Giá trị lớn ban đầu
        int order[3] = {0, 1, 2};
        
        // Duyệt tất cả các thứ tự mở cửa
        do {
            bool seats[60] = {false}; // Mảng trạng thái ghế trống
            
            int currentDistance = 0;
            for (int i = 0; i < 3; ++i) {
                currentDistance += calculateDistance(N, positions[order[i]], passengers[order[i]], seats);
            }
            
            if (currentDistance < minDistance) {
                minDistance = currentDistance;
            }
        } while (nextPermutation(order, 3));
        
        cout << "Case #" << caseNum << "\n" << minDistance << "\n";
    }
    
    return 0;
}
//mario climb
#include <iostream>

using namespace std;
int M, N;
int xS, yS, xE, yE;
int front, rear;
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
int A[55][55];
int visit[55][55];
int ans;

struct Node{
    int r,c;
};

Node queue[100000];

void enQueue(int x, int y){
    Node node; node.r = x; node.c = y;
    rear++;
    queue[rear] = node;
}

Node deQueue(){
    front++;
    return queue[front];
}

void resetVisit(){
    for (int i = 0; i < M; i++)
    {
        for (int j = 0; j < N; j++)
        {
            visit[i][j] = 0;
        }
    }
}



int check(int k){
    resetVisit();
    front = rear = -1;
    enQueue(xS,yS);
    visit[xS][yS] = 1;

    while (front!=rear)
    {
        Node mid = deQueue();
        if(mid.r == xE && mid.c == yE){
            return 1;
        }

        for (int i = 2; i <= 3; i++)
        {
            for (int j = 1; j <= k; j++)
            {
                int tx = mid.r + dx[i] * j;
                int ty = mid.c + dy[i];
                if (tx >= 0 && tx < M && ty >= 0 && ty < N && visit[tx][ty] == 0 && (A[tx][ty] == 1 || A[tx][ty] == 3))
                {
                    enQueue(tx,ty);
                    visit[tx][ty] = 1;
                }
            }
        }

        for (int i = 0; i < 2; i++)
        {
            int tx = mid.r + dx[i];
            int ty = mid.c + dy[i];
            if (tx >= 0 && tx < M && ty >= 0 && ty < N && visit[tx][ty] == 0 && (A[tx][ty] == 1 || A[tx][ty] == 3))
                {
                    enQueue(tx,ty);
                    visit[tx][ty] = 1;
                }
        }
    }

    return 0;

}

int fun(int s, int e){
    int mid = s + (e - s)/2;
    if (check(mid-1) == 0 && check(mid) == 1)
    {
        return mid;
    }

    if(check(mid) == 1){
        return fun(s,mid);
    }else
    {
        return fun(mid+1,e);
    }
}

int main(){
    int tc, T;
    //freopen("input.txt", "r", stdin);
    cin>> T;

    for (tc = 1; tc <= T; tc++)
    {
        cin >> M >> N;
        ans = 0;

        for (int i = 0; i < M; i++)
        {
            for (int j = 0; j < N; j++)
            {
                cin>> A[i][j];
                if(A[i][j] == 2){
                    xS = i;
                    yS = j;
                }
                if (A[i][j] == 3)
                {
                    xE = i;
                    yE = j;
                }
            }
        }

        ans = fun(1,50);
        cout<< "Case #" << tc <<endl;
        cout<< ans << endl;

    }


    return 0;
}
//HUgo chi ong nau
#include<iostream>
using namespace std;


int T, M, N;
int arr[20][20], visited[20][20];
int Answer;
// -1 0, 0 1, 1 1, 1 0, 1 -1, 0 -1
// -1 0, -1 1, 0 1, 1 0, 0 -1, -1 -1;
int dxc[6] = {-1, 0, 1, 1, 1, 0};
int dyc[6] = {0, 1, 1, 0, -1, -1};

int dxl[6] = {-1, -1, 0, 1, 0, -1};
int dyl[6] = {0, 1, 1, 0, -1, -1};

bool isValid(int x, int y){
	return x >= 1 && x <= N && y > 0 && y <= M;
}

void bt(int x, int y, int sum, int count){
	if(count == 4){
		if(Answer < sum){
			Answer = sum;
		}
		return;
	}
	for(int i = 0; i < 6; i++){
		if(y % 2 == 0){
			int nx = x + dxc[i];
			int ny = y + dyc[i];
			if(isValid(nx, ny) && visited[nx][ny] == 0 ){
				visited[nx][ny] = 1;
				
				bt(nx, ny, sum+ arr[nx][ny], count+1);
				bt(x,y,sum+arr[nx][ny],count+1);
				visited[nx][ny] = 0;
			}
			
		}
		else{
			int nx = x + dxl[i];
			int ny = y + dyl[i];
			if(isValid(nx, ny) && visited[nx][ny] == 0){
				visited[nx][ny] = 1;
				
				bt(nx, ny, sum+ arr[nx][ny], count+1);
				bt(x,y,sum+arr[nx][ny],count+1);
				visited[nx][ny] = 0;
			}
		}
	}
}

void reset(){
	for(int i = 1; i <= N; i++){
		for(int j = 1; j <= M; j++){
			visited[i][j] = 0;
		}
	}
}

int main(){
	//freopen("input.txt", "r", stdin);
	cin >> T;
	for(int tc = 1; tc <= T; tc++){
		Answer = 0;
		cin >> M >> N;
		for(int i = 1; i <= N; i++){
			for(int j = 1; j <= M; j++){
				cin >> arr[i][j];
			}
		}
		for(int i = 1; i <= N; i++){
			for(int j = 1; j <= M; j++){
				visited[i][j] = 1;
				int sum = arr[i][j];
				bt(i, j, sum, 1);
				reset();
			}
		}
		cout << "Case #" <<tc << endl;
		cout << long long( Answer * Answer) << endl;

	}
	return 0;
}
//Visit department
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class Solution {
	static int N, E, K , T;
	static int len = 201;
	static double[][] arr = new double[len][len];
	static double[][] timeXacSuat = new double[len][len];
	
	public static void main(String[] args) {
		try {
			System.setIn(new FileInputStream("input.txt"));
		} catch (FileNotFoundException e) {

		}
		Scanner sc = new Scanner(System.in);
		for (int tcid = 1; tcid <= 15; tcid++) {
			N = sc.nextInt();	//so phong ban
			E = sc.nextInt();	//so mui ten
			K = sc.nextInt();	//time kang
			T = sc.nextInt();	//time = minutes
			reset();
			for (int i = 0; i < E; i++) {
				int dinh1 = sc.nextInt();
				int dinh2 = sc.nextInt();
				arr[dinh1][dinh2] = sc.nextDouble();
				
			}
			
			//node
			timeXacSuat[1][0] = 1;
			for(int t = 1; t <= T/10; t++){
				for(int i = 1; i <= N; i++){
					if(timeXacSuat[i][t-1] != 0){
						for(int j = 1; j <= N; j++){
							if(arr[i][j] != 0){
								timeXacSuat[j][t] += timeXacSuat[i][t-1]*arr[i][j];
							}
						}
					}
				}
			}
			//Jang start tai 0, Kang tai K
			//10p di chuyen 1 lan
			int jangTime = T/10, kangTime = (T-K)/10;
			int jangD = 0, kangD = 0;
			double jangXS = 0, kangXS = 0;
			for(int i = 1; i <= N; i++){
				if(timeXacSuat[i][jangTime] > jangXS){
					jangXS = (double) timeXacSuat[i][jangTime];
					jangD = i;
				}
				if(timeXacSuat[i][kangTime] > kangXS){
					kangXS = (double) timeXacSuat[i][kangTime];
					kangD = i;
				}
			}
			
			System.out.print("#" + tcid + " ");
			System.out.printf("%d %.6f %d %.6f\n", jangD, jangXS, kangD, kangXS);
		}
		sc.close();
	}
	
	
	private static void reset(){
		for(int i = 0; i < arr.length; i++){
			for(int j = 0; j < arr[i].length; j++){
				arr[i][j] = 0;
				timeXacSuat[i][j] = 0;
			}
		}
	}
}
//Cover dominos
#include <iostream>

using namespace std;

#define N 7
#define M 8

int T, results, nx, ny, index, tt;
int matrix[50][50];
int visit[10][10];
int dt[2][2] = {{0,1},{1,0}};
int state[50][50];
int Q[100][2];

void BT(int x, int cnt, int y){
	if (x == N && cnt == 28) {
		results++;
		return;
	}
	if (x == N) return;
	
	if (state[x][y] == 0){
		tt = 1;
		for (int k = 0; k < 2; k++){
			nx = x + dt[k][0];
			ny = y + dt[k][1];
			if (nx >= 0 && nx < N && ny >= 0 && ny < M && visit[matrix[nx][ny]][matrix[x][y]] == 0 && state[nx][ny] == 0){
				tt = 0;
				state[x][y] = cnt+1;
				state[nx][ny] = cnt+1;
				visit[matrix[nx][ny]][matrix[x][y]] = 1;
				visit[matrix[x][y]][matrix[nx][ny]] = 1;
				Q[index][0] = nx; Q[index][1] = ny; index++;
				if (ny < M-1) BT(x,cnt+1,y+1);
				else BT(x+1,cnt+1,0);
				index--;
				state[x][y] = 0;
				state[Q[index][0]][Q[index][1]] = 0;
				visit[matrix[Q[index][0]][Q[index][1]]][matrix[x][y]] = 0;
				visit[matrix[x][y]][matrix[Q[index][0]][Q[index][1]]] = 0;
			}
		}
		if (tt == 1) return;
	}
	else if (y < M - 1) BT(x,cnt,y+1);
	else BT(x+1,cnt,0);
	
}

int main(){
	freopen("input.txt","r",stdin);
	cin >> T;
	for (int t = 0; t < T; t++){
		results = 0;
		index = 0;
		for (int i = 0; i < N; i++){
			for (int j = 0; j < M; j++){
				cin >> matrix[i][j];
				state[i][j] = 0;
			}
		}
		for (int i = 0; i < N; i++){
			for (int j = 0; j < N; j++){
				visit[i][j] = 0;
			}
		}
		BT(0, 0, 0);
		cout << "#" << t + 1 << " " << results << endl;
	}
	return 0;
}
//Connect Processor
#include<iostream>

// code 100/100
// Backtrack (trả lại visit)

using namespace std;
int tc,n,map[12][12], visited[12][12];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; // trên, phải, xuống, trái
int chip[2][12], minn=987654,cnt=0,dai=0;

bool checkMap(int x, int y){
    return (x<n && y<n && x>=0 && y>=0);
}

bool checkHuong (int x, int y, int hgx, int hgy){
	int tempx = x+hgx;
	int tempy = y+hgy;
	while(checkMap(tempx,tempy)){
		if(visited[tempx][tempy]==1){
			return false;
		}
		tempx += hgx;
		tempy += hgy;
	}
	return true;
}
void visit(int x, int y, int hgx, int hgy, int val){
	int tempx = x+hgx;
	int tempy = y+hgy;
    dai=0;
    while(checkMap(tempx,tempy) && map[tempx][tempy]==0){
        dai++;
        visited[tempx][tempy]+=val; // đánh dấu ô đã đi qua
		tempx += hgx;
		tempy += hgy;
    }
}
void BT(int xx,int sum){ // chip, sum
    if(sum>minn) return;
    if(xx==cnt){
        if(sum<minn) minn=sum;
        return;
    }
    int x=chip[0][xx];
    int y=chip[1][xx];
    if(x==-1 && y==-1){ // chip(-1,-1) là ko thể nối nguồn
        BT(xx+1,sum);
    }
    else{
        for(int i=0;i<4;i++){ // đi 4 hướng
            if(checkHuong(x,y,dx[i],dy[i]) ){
                visit(x,y,dx[i],dy[i],1);
                BT(xx+1,sum+dai);
                visit(x,y,dx[i],dy[i],-1); // trả lại visit
            }
        }
        return;
    }
}
int main(){
    
    cin>>tc;
    for(int t=1;t<=tc;t++){
        cin>>n;
        minn=987654;
        cnt=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                visited[i][j]=0;
                cin>>map[i][j];
                if(map[i][j]==1){
                    if(i==0 || i==n-1 || j==0 ||j==n-1){}
                    else { // chỉ lưu các chip trong bo
                        chip[0][cnt]=i;
                        chip[1][cnt]=j;
                        cnt++;
                    }
                    visited[i][j]=1;
                }
            }
        }
        for(int i=0;i<cnt;i++){ // check tất cả các chip theo 4 hướng
            bool ch[4];
            for(int j=0;j<4;j++){ // check 4 hướng cửa chip
                ch[j]=checkHuong(chip[0][i],chip[1][i],dx[j],dy[j]);
            }
            if(!ch[0] && !ch[1] && !ch[2] && !ch[3] ){ // chip ko đi được hướng nào cả
                chip[0][i]=-1;
                chip[1][i]=-1;
            }
        }
        BT(0,0);
        if(minn==987654) cout<<"#"<<t<< " "<<0<<endl;
        else {
            cout<<"#"<<t<<" "<<minn<<endl;
        }
    }
	
    return 0;
}
Editor is loading...
Leave a Comment