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 }

 

posted @ 2016-03-01 16:03  cherry_yue  阅读(39)  评论(0)    收藏  举报