Nightmare(BFS)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <queue>
 5 #define size 10
 6 #define Max 100000
 7 using namespace std;
 8 struct point{
 9     int x,y,now,l;
10 };
11 int dx[]={0,1,-1,0},dy[]={-1,0,0,1};
12 int map[size][size];
13 int step[size][size],ti[size][size];
14 int n,m;
15 point start;
16 int x,y,now,l;
17 bool flag;
18 void bfs()
19 {
20     queue<point> s;
21     s.push(start);
22     int i,j;
23     point next;
24     while(!s.empty())
25     {
26         point pos=s.front();
27         s.pop();
28         if(map[pos.x][pos.y]==3)    {flag=1;cout<<pos.l<<endl;break;}
29         if(pos.now>1)
30         {
31             for(i=0;i<4;i++)
32             {
33                 x=pos.x+dx[i];
34                 y=pos.y+dy[i];
35                 now=pos.now-1;
36                 l=pos.l+1;
37                 if((x>=0&&y>=0&&x<n&&y<m&&map[x][y]!=0))
38                 {
39                     if(map[x][y]==4)    {now=6;map[x][y]=0;}
40                     next.x=x,next.y=y,next.now=now,next.l=l;
41                     s.push(next);
42                 }
43             }
44         }
45     }
46 }
47 int main()
48 {
49     int T,i,j;
50     freopen("in.txt","r",stdin);
51     cin>>T;
52     while(T--)
53     {
54         cin>>n>>m;
55         for(i=0;i<n;i++)
56             for(j=0;j<m;j++)
57             {
58                 cin>>map[i][j];
59                 if(map[i][j]==2)    {start.x=i,start.y=j;}
60             }
61         for(i=0;i<size;i++)
62             for(j=0;j<size;j++)
63                 step[i][j]=Max;
64         flag=0;
65         start.now=6,start.l=0;
66         bfs();
67         if(!flag)    cout<<-1<<endl;
68     }
69 }

 

posted @ 2015-11-27 23:19  御心飞行  阅读(174)  评论(0编辑  收藏  举报