标签:|| roo exti 判断 strong break 初始 ret main
题意:有一个m*n大小的房间与房间的描述,1代表该点不可通过或到达,0代表该点能通过或到达。
然后给你若干个行动的描述,每一步按先后顺序排列,包含的参数有移动的最短距离,最长距离与方向。问房间有几个可能的起点,使其能够走完全部行动。
思路:枚举每一个点,按命令顺序跑dfs,注意命令2 4 U的时候要判断移动1的时候
Sample Input
2 6 6 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 2 R 1 2 D 1 1 R 0 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 1 2 R 3 7 U 0 0
Sample Output
10 0
1 import java.util.Scanner; 2 public class Main { 3 static int n,m,map[][],l[],r[],ML,room=0; 4 static char dir[]; 5 static boolean first; 6 public static void main(String args[]) 7 { 8 Scanner sc=new Scanner(System.in); 9 int T=sc.nextInt(); 10 while(T--!=0) 11 { 12 n=sc.nextInt();m=sc.nextInt(); 13 map=new int[n+1][m+1]; 14 l=new int[10000];r=new int[10000];dir=new char[10000];//存命令 15 for(int i=1;i<=n;i++) 16 for(int j=1;j<=m;j++) 17 map[i][j]=sc.nextInt(); 18 int i=1; 19 while(true) 20 { 21 int a,b; 22 char c; 23 a=sc.nextInt();b=sc.nextInt(); 24 if(a==0&&b==0) 25 break; 26 c=sc.next().charAt(0); 27 l[i]=a;r[i]=b;dir[i++]=c; 28 } 29 first=true; 30 ML=i-1;room=0;//初始房间=0,命令个数为i-1; 31 for(i=1;i<=n;i++) 32 for(int j=1;j<=m;j++) 33 { 34 if(map[i][j]==0&&dfs(i,j,1))//枚举起点 35 { 36 room++; 37 } 38 } 39 System.out.println(room); 40 41 } 42 } 43 public static boolean dfs(int x,int y,int ml) 44 { 45 if(ml>ML) 46 { 47 return true; 48 } 49 boolean bool=false; 50 for(int i=l[ml];i<=r[ml];i++)//枚举可以走的步数i 51 { 52 int dx=-1,dy=-1; 53 if(dir[ml]==‘U‘) 54 { 55 for(int j=x;j>=x+l[ml];j--)//2 4 U的时候要判断移动1的时候 56 if(!(j>=1&&j<=n)||map[j][y]==1) 57 return false; 58 for(int j=l[ml];j<=i;j++) 59 if(!((x-j)>=1&&(x-j<=n))||map[x-j][y]==1)//如果走2步不行,那么后面肯定也走不了了,return false; 60 return false; 61 dx=x-i;dy=y; 62 bool=dfs(dx,dy,ml+1);//如果dx,dy走的通,rom++,否则继续尝试,注意是continue 63 if(bool) 64 return true; 65 else 66 continue; 67 } 68 else if(dir[ml]==‘D‘) 69 { 70 for(int j=x;j<=x+l[ml];j++) 71 if(!(j>=1&&j<=n)||map[j][y]==1) 72 return false; 73 for(int j=l[ml];j<=i;j++) 74 if(!((x+j)>=1&&(x+j<=n))||map[x+j][y]==1) 75 return false; 76 dx=x+i;dy=y;//System.out.println(x+" "+y+"通过命令: "+ml+"D 移动"+i+" 到 "+dx+" "+dy); 77 bool=dfs(dx,dy,ml+1); 78 if(bool) 79 return true; 80 else 81 continue; 82 } 83 else if(dir[ml]==‘L‘) 84 { 85 for(int j=y;j>=y-l[ml];j--) 86 if(!(j>=1&&j<=m)||map[x][j]==1) 87 return false; 88 for(int j=l[ml];j<=i;j++) 89 if(!((y-j)>=1&&(y-j<=m))||map[x][y-j]==1) 90 return false; 91 dx=x;dy=y-i;//System.out.println(x+" "+y+"通过命令: "+ml+"L 移动"+i+" 到 "+dx+" "+dy); 92 bool=dfs(dx,dy,ml+1); 93 if(bool) 94 return true; 95 else 96 continue; 97 } 98 else 99 { 100 for(int j=y;j<=y+l[ml];j++) 101 if(!(j>=1&&j<=m)||map[x][j]==1) 102 return false; 103 for(int j=l[ml];j<=i;j++) 104 if(!((y+j)>=1&&(y+j<=m))||map[x][y+j]==1) 105 return false; 106 dx=x;dy=y+i;//System.out.println(x+" "+y+"通过命令: "+ml+"R 移动"+i+" 到 "+dx+" "+dy);//System.out.println("r"); 107 bool=dfs(dx,dy,ml+1); 108 if(bool) 109 return true; 110 else 111 continue; 112 } 113 114 } 115 return false; 116 } 117 }
标签:|| roo exti 判断 strong break 初始 ret main
原文地址:https://www.cnblogs.com/gdskl/p/11445302.html