【题目大意】
给出一张地图,一旦往一个方向前进就必须一直向前,直到一下情况发生:(1)碰到了block,则停在block前,该block消失;(2)冲出了场地外;(3)到达了终点。改变方向十次以上或者冲出场外都判输,问至少几步能到达终点,无法到达输出-1。
【思路】
DFS,往四个方向搜索,每次不断向前直到出现如上三种情形,并根据三种情形操作,有点类似于模拟。回溯的时候犯的小错误记在代码的注释里面了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int MAXN=20+5; 6 const int INF=0x7fffffff; 7 int map[MAXN][MAXN]; 8 int dx[4]={0,0,1,-1}; 9 int dy[4]={1,-1,0,0}; 10 int line,row,sx,sy; 11 int ans; 12 13 void dfs(int x,int y,int step) 14 { 15 if (step>10 || step>ans) return; 16 for (int i=0;i<4;i++) 17 { 18 int tx=x+dx[i],ty=y+dy[i]; 19 if (map[tx][ty]==1) continue; 20 while (tx<line && ty<row && tx>=0 && ty>=0 && map[tx][ty]!=3 && map[tx][ty]!=1) 21 { 22 tx+=dx[i]; 23 ty+=dy[i]; 24 } 25 if (tx==line || ty==row || tx<0 || ty<0) continue; 26 /*冲出场外判为输*/ 27 28 if (map[tx][ty]==3) 29 { 30 /*到达终点记录最小步数*/ 31 if (step<ans) ans=step; 32 continue; 33 } 34 35 else if (map[tx][ty]==1) 36 { 37 /*碰到障碍物则停在障碍物前,并清除障碍物*/ 38 map[tx][ty]=0; 39 dfs(tx-dx[i],ty-dy[i],step+1); 40 map[tx][ty]=1; 41 /* 42 map[tx][ty]=0; 43 tx-=dx[i]; 44 ty-=dy[i]; 45 dfs(tx,ty,step+1); 46 map[tx+dx[i]][ty+dy[i]]=1;←如上情况是,回溯时千万不要忘记把倒退的步骤加回去 47 */ 48 } 49 } 50 } 51 52 int main() 53 { 54 while (scanf("%d%d",&row,&line)) 55 { 56 if (row==line && line==0) break; 57 for (int i=0;i<line;i++) 58 for (int j=0;j<row;j++) 59 { 60 scanf("%d",&map[i][j]); 61 if (map[i][j]==2) 62 { 63 sx=i;sy=j; 64 map[i][j]=0; 65 } 66 } 67 ans=INF; 68 dfs(sx,sy,1); 69 if (ans!=INF) cout<<ans<<endl; 70 else cout<<-1<<endl; 71 } 72 return 0; 73 }
时间: 2024-10-11 11:34:21