CleaningRobot

 avatar
unknown
plain_text
a year ago
3.2 kB
2
Indexable
package cleaningrobot;

import java.util.Scanner;

public class cleaningrobot {
	static int arr[][], n, m, T, visited[][], dist[][], min, check[];
	static int qx[] = new int[200000], qy[] = new int[200000], frontx, rearx, fronty, reary;
	static int dx[] = {-1,0,1,0};
	static int dy[] = {0,1,0,-1};
	static int dirX[], dirY[], robotX, robotY, index;
	
	static void init(){
		frontx = rearx = fronty = reary = -1;
		
	}
	static boolean isEmtyx(){
		if(frontx == rearx) return true;
		return false;
	}
	static boolean isEmtyy(){
		if(fronty == reary) return true;
		return false;
	}
	static void enQueuex(int e){
		rearx ++;
		qx[rearx] = e;
	}
	static void enQueuey(int e){
		reary ++;
		qy[reary] = e;
	}
	static int deQueuex(){
		if(!isEmtyx()){
			frontx ++;
			return qx[frontx];
		}
		return -1;
	}
	static int deQueuey(){
		if(!isEmtyy()){
			fronty ++;
			return qy[fronty];
		}
		return -1;
	}
	static boolean check(int x, int y){
		if(x<0 || x>=n || y<0 || y>=m)return false;
		return true;
	}
	
	static void bfs(int i, int j, int curDir){
		visited[i][j] = 1;
		enQueuex(i);
		enQueuey(j);
		while(!isEmtyx() && !isEmtyy()){
			int x = deQueuex();
			int y = deQueuey();
			for(int k=0; k<4; k++){
				int tx = x + dx[k];
				int ty = y + dy[k];
				if(check(tx, ty)){
					if(arr[tx][ty] != 2 && visited[tx][ty] == 0){
						visited[tx][ty] = visited[x][y] + 1;
						enQueuex(tx);
						enQueuey(ty);
					}
				}
			}
		}
		for(int z=curDir + 1; z<index; z++){
			if(visited[dirX[z]][dirY[z]]!=0){
				dist[curDir][z] = visited[dirX[z]][dirY[z]] - 1;
				dist[z][curDir] = dist[curDir][z];
			}
			else{
				dist[curDir][z] = -1;
				dist[z][curDir] = -1;
			}
		}
	}
	static void backtrack(int curDir, int numDir, int d){
		if(numDir == index - 1 ){
			if(d<min) min = d;
			return;
		}
		if(d>min)
			return;
		for(int i=1; i<index; i++){
			if(check[i] == 0 && dist[curDir][i] > 0){
				check[i] = 1;
				backtrack(i, numDir + 1, d + dist[curDir][i]);
				check[i] = 0;
			}
		}
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		T = sc.nextInt();
		for(int t=1; t<=T; t++){
			n = sc.nextInt();
			m = sc.nextInt();
			arr = new int[n][m];
			dirX = new int[12];
			dirY = new int[12];
			index = 1;
			for(int i=0; i<n; i++){
				for(int j=0; j<m; j++){
					arr[i][j] = sc.nextInt();
					if(arr[i][j] == 3){
						robotX = i;
						robotY = j;
					}
					if(arr[i][j] == 1){
						dirX[index] = i;
						dirY[index] = j;
						index++;
					}
				}
			}
			dist = new int[12][12];
			//duong di tu robot den cac vet ban
			init();
			visited = new int[n][m];
			bfs(robotX, robotY, 0);
			
			//duong di tu cac vet ban den nhau
			
			for(int i=1; i<index; i++){	
				init();
				visited = new int[n][m];
				bfs(dirX[i], dirY[i], i);
			}
			min = Integer.MAX_VALUE;
			check = new int[index];
			backtrack(0, 0, 0);
			if(min != Integer.MAX_VALUE){
				System.out.println("Case #"+t+"\n"+min);
			}
			else{
				System.out.println("Case #"+t+"\n"+-1);
			}
		}
	}

}
Editor is loading...
Leave a Comment