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 }
View Code

 

你可能感兴趣的:(HDU)