HDU4527+BFS

模拟BFS搜索

对于一个将要爆炸的点,可能同时由多个点引起。

 1 /*
 2 模拟搜索过程
 3 */
 4 #include<stdio.h>
 5 #include<stdlib.h>
 6 #include<string.h>
 7 #include<algorithm>
 8 #include<queue>
 9 using namespace std;
10 const int maxn = 8;
11 int mat[ maxn ][ maxn ];
12 int mytime[ maxn ][ maxn ];
13 const int dx[] = {0,0,-1,1};
14 const int dy[] = {1,-1,0,0};
15 struct node{
16     int x,y,ti,flag;
17 };
18 void solve( int x,int y ){
19     queue<node>q;
20     node cur,nxt;
21     cur.x = x;
22     cur.y = y;
23     cur.ti = 0;
24     cur.flag = -1;
25     mytime[x][y] = 0;
26     mat[cur.x][cur.y]++;
27     q.push( cur );
28     
29     while( !q.empty() ){
30         cur=q.front();
31         q.pop();
32         if( cur.flag==-1 )
33             mat[cur.x][cur.y] = 0;
34         for( int i=0;i<4;i++ ){
35             nxt.x = cur.x+dx[i];
36             nxt.y = cur.y+dy[i];
37             nxt.ti = cur.ti+1;
38             if( cur.flag!=-1&&cur.flag!=i ) continue;
39             if( nxt.x<1||nxt.x>6||nxt.y<1||nxt.y>6 ) continue;
40             if( mat[nxt.x][nxt.y]==0 ){
41                 nxt.flag = i;
42                 q.push( nxt );
43             }
44             else if( mat[nxt.x][nxt.y]>=1&&mat[nxt.x][nxt.y]<=3 ){
45                 mat[nxt.x][nxt.y]++;
46             }
47             else if( mat[nxt.x][nxt.y]==4 ){
48                 nxt.flag = -1;
49                 q.push( nxt );
50                 mat[ nxt.x ][ nxt.y ]++;
51                 mytime[nxt.x][nxt.y] = nxt.ti;
52             }
53             else if( mat[nxt.x][nxt.y]>4 ){
54                 if( nxt.ti<=mytime[nxt.x][nxt.y] ){
55                     mat[nxt.x][nxt.y]++;
56                 }
57                 else {
58                     nxt.flag = i;
59                     q.push( nxt );
60                 }
61             }
62         }
63     }
64     return ;
65 }
66 
67 int main(){
68     while( scanf("%d",&mat[ 1 ][ 1 ])==1 ){
69         for( int i=2;i<=6;i++ )
70             scanf("%d",&mat[ 1 ][ i ]);
71         for( int i=2;i<=6;i++ )
72             for( int j=1;j<=6;j++ )
73                 scanf("%d",&mat[ i ][ j ]);
74         int m;
75         int x,y;
76         scanf("%d",&m);
77         while( m-- ){
78             scanf("%d%d",&x,&y);
79             if( mat[ x ][ y ]<=3 ){
80                 mat[ x ][ y ] ++;
81                 continue;
82             }
83             memset( mytime,-1,sizeof( mytime ) );
84             solve( x,y );
85         }
86         for( int i=1;i<=6;i++ ){
87             for( int j=1;j<=6;j++ ){
88                 if( j==1 ) printf("%d",mat[ i ][ j ]);
89                 else printf(" %d",mat[ i ][ j ]);
90             }
91             printf("
");
92         }
93         printf("
");
94     }
95     return 0;
96 }
View Code
keep moving...
原文地址:https://www.cnblogs.com/xxx0624/p/3188064.html