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("\n"); 92 } 93 printf("\n"); 94 } 95 return 0; 96 }
keep moving...