POJ1017 Illusive Chase

题意:有一个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 }
View Code

 

猜你喜欢

转载自www.cnblogs.com/gdskl/p/11445302.html
今日推荐