poj 3009 Curling 2.0 (DFS/枚举排列)
题意:冰面为矩阵,有起始点,终点和障碍,周围是障碍不能走,有空的可以走,如果空的前面是障碍物就可以把障碍撞掉,如果出界或者10步以内不能走到终点就算输。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 int k,res,w,h,ex,ey; 8 int mz[21][21]; 9 int dx[4]= {-1,0,1,0}; 10 int dy[4]= {0,1,0,-1}; 11 void f(int x,int y,int dir,int s) //从(x,y)向dir方向走 12 { 13 int xx,yy; 14 xx=x+dx[dir]; //移动一步后的坐标 15 yy=y+dy[dir]; 16 if(xx<0||xx>=h||yy<0||yy>=w||k||mz[xx][yy]||s>res||s>10) return; //移动一步后出界就返回 17 // printf("wwww xx:%d,yy:%d,s:%d,dir:%d\n",xx,yy,s,dir); 18 while(xx>=0&&xx<h&&yy>=0&&yy<w&&!mz[xx][yy]) //没有出界并且没有障碍物就沿dir方向的直线一直走 19 { 20 if(xx==ex&&yy==ey) 21 { 22 //k=1; 23 if(s<res)res=s; 24 return; //如果到了终点就返回 25 } 26 xx=xx+dx[dir]; 27 yy=yy+dy[dir]; 28 } 29 // printf("xx:%d,yy:%d,s:%d,dir:%d\n",xx,yy,s,dir); 30 if(xx>=0&&xx<h&&yy>=0&&yy<w)//碰到了障碍物 31 { 32 x=xx-dx[dir]; 33 y=yy-dy[dir]; 34 mz[xx][yy]=0; //障碍物设0表示消去了 35 for(int i=0; i<4; i++) 36 { 37 f(x,y,i,s+1); //从(x,y)出发走4个方向 38 } 39 mz[xx][yy]=1; //这条路走过了,重新设成1,返回到上一个十字路口 40 } 41 else return; //按dir方向走直线出界了,返回 42 } 43 44 int main() 45 { 46 int i,j,sx,sy; 47 while(cin>>w>>h&&w&&h) 48 { 49 k=0,res=1e3; //结果res初始化为较大数 50 for(i=0; i<h; i++) //处理矩阵 51 { 52 for(j=0; j<w; j++) 53 { 54 cin>>mz[i][j]; 55 if(mz[i][j]==2) 56 { 57 mz[i][j]=0; 58 sx=i; 59 sy=j; 60 } 61 else if(mz[i][j]==3) 62 { 63 mz[i][j]=0; 64 ex=i; 65 ey=j; 66 } 67 } 68 } 69 for(int i=0; i<4&&!k; i++){ //从起始点开始依次向4个方向走 70 f(sx,sy,i,1); 71 } 72 if(res==1e3||res>10) printf("-1\n"); 73 else printf("%d\n",res); 74 } 75 return 0; 76 }

浙公网安备 33010602011771号