POJ 3009 Curling 2.0
先吐槽一下:模拟神马的最讨厌了!!!!
题目大意:
给定一个地形图,要求类似于把冰壶从起点(标号2),移动到终点(标号3),求最小停止次数(没撞一次石块停止一次)。
需要注意:
1、冰壶撞到石头后,冰壶会停在石头前面,此时(静止状态)才允许改变冰壶的运动方向,而该块石头会破裂,石头所在的区域由1变为0. 也就是说,冰壶撞到石头后,并不会取代石头的位置。
2、终点是一个摩擦力很大的区域,冰壶若到达终点3,就会停止在终点的位置不再移动。
3、当出界时,就视为这个方向不能走。
4、旁边是石块的话不能直接把石块砸碎。
这是个DFS水题,仔细就好,注意x,y不要对应错了。
下面是代码:
#include <stdio.h> int w,h,map1[25][25],min1,x,y; void DFS (int x1,int y1,int drct,int step)// n:0 s:1 w:2 e:3 { if(step>=10) { return ; } switch(drct) { case 0: if(y1-1<0||map1[y1-1][x1]==1) return;break; case 1: if(y1+1==h||map1[y1+1][x1]==1)return;break; case 2: if(x1-1<0||map1[y1][x1-1]==1)return;break; case 3: if(x1+1==w||map1[y1][x1+1]==1)return;break; } while(1) { switch(drct) { case 0: { if(y1-1<0) return; else if(map1[y1-1][x1]==0)y1--; else if(map1[y1-1][x1]==3) { if(min1>step) { min1=step; } return ; } else if(map1[y1-1][x1]==1) { map1[y1-1][x1]=0; DFS(x1,y1,0,step+1); DFS(x1,y1,1,step+1); DFS(x1,y1,2,step+1); DFS(x1,y1,3,step+1); map1[y1-1][x1]=1; return ; } break; } case 1: { if(y1+1==h)return; else if (map1[y1+1][x1]==0)y1++; else if(map1[y1+1][x1]==3) { if(min1>step) { min1=step; } return ; } else if(map1[y1+1][x1]==1) { map1[y1+1][x1]=0; DFS(x1,y1,0,step+1); DFS(x1,y1,1,step+1); DFS(x1,y1,2,step+1); DFS(x1,y1,3,step+1); map1[y1+1][x1]=1; return ; } break; } case 2: { if(x1-1<0)return; else if(map1[y1][x1-1]==0)x1--; else if(map1[y1][x1-1]==3) { if(min1>step) { min1=step; } return ; } else if(map1[y1][x1-1]==1) { map1[y1][x1-1]=0; DFS(x1,y1,0,step+1); DFS(x1,y1,1,step+1); DFS(x1,y1,2,step+1); DFS(x1,y1,3,step+1); map1[y1][x1-1]=1; return; } break; } case 3: { if(x1+1==w)return; else if(map1[y1][x1+1]==0)x1++; else if(map1[y1][x1+1]==3) { if(min1>step) { min1=step; } return ; } else if(map1[y1][x1+1]==1) { map1[y1][x1+1]=0; DFS(x1,y1,0,step+1); DFS(x1,y1,1,step+1); DFS(x1,y1,2,step+1); DFS(x1,y1,3,step+1); map1[y1][x1+1]=1; return ; } break; } } } } int main() { int i,j,k; while(scanf("%d%d",&w,&h),w||h) { min1=1<<30; for(i=0; i<h; i++) { for(j=0; j<w; j++) { scanf("%d",&map1[i][j]); if(map1[i][j]==2) { y=i; x=j; map1[i][j]=0; } } } for(i=0; i<4; i++) { DFS(x,y,i,0); } if(min1==1<<30) { printf("-1\n"); } else { printf("%d\n",min1+1); } } return 0; }