BFSパトロールロボット

9204 ワード

パトロールロボット
テーマリンク:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/F
タイトルの大意:
    ロボットが長方形のエリアをパトロールしているのは、グリッド(m行とn列)です.左上(1,1)から右下(m,n)までです.ネットワーク
の中のいくつかの格子は空地(0で表します)で、その他の格子は障害です(1で表します).ロボットは毎回4つの方向に行きますが、いけません.
連続してk障害を通り抜けて、最も短い長さを求めます.
分析:
 
   bfsで検索しますが、障害があったら記録してください.障害がkを超えたら前のステップに戻ります.
 1 #include<iostream>
 2 #include<queue>
 3 #include<cstring>
 4 using namespace std;
 5 int n,m,k,t;
 6 int map[25][25];
 7 int d[4][2]= {1,0,-1,0,0,-1,0,1};
 8 int c[25][25][25];
 9 struct A
10 {
11     int x,y;
12     int count;
13     int l;
14     A(int x,int y,int count,int l):x(x),y(y),count(count),l(l) {}
15 };
16 int Do()
17 {
18     queue<A>q;
19     A a(1,1,0,0);
20     q.push(a);
21     c[1][1][0]=1;
22    while(!q.empty())
23     {
24         A now=q.front();
25          q.pop();
26         if(now.x==n&&now.y==m)
27             return now.count;
28         for(int i=0; i<4; i++)
29         {
30             int x=d[i][0]+now.x;
31             int y=d[i][1]+now.y;
32             int l=now.l;
33             if(map[x][y]==1)
34                 l++;
35                 else
36                 l=0;
37             if(l<=k&&c[x][y][l]!=1&&x>=1&&y>=1&&x<=n&&y<=m)
38             {
39                 c[x][y][l]=1;
40                 q.push(A(x,y,now.count+1,l));
41             }
42         }
43     }
44     return -1;
45 }
46 int main()
47 {
48     cin>>t;
49     while(t--)
50     {    
51           memset(c,0,sizeof(c));
52         cin>>n>>m>>k;
53         for(int i=1; i<=n; i++)
54             for(int j=1; j<=m; j++)
55                 cin>>map[i][j];
56         cout<<Do()<<endl;
57     }
58     return 0;
59 }