hdu4678Mine

http://acm.hdu.edu.cn/showproblem.php?pid=4678

之前写了一并差集找连通块 貌似不对 比赛时写的dfs爆栈了 只好用bfs了

单独数字块  为1

空白+数字块 数字数%2+1

异或

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<stdlib.h>

 5 #include<algorithm>

 6 #include<queue>

 7 using namespace std;

 8 #define N 1010

 9 int dis[8][2] = {1,0,-1,0,0,1,0,-1,1,1,1,-1,-1,1,-1,-1};

10 int n,m,k;

11 int vis[N][N],o[N][N],f[N][N];

12 struct node

13 {

14     int x,y;

15 };

16 int bfs(int x,int y)

17 {

18     queue<node>q;

19     struct node st,sd;

20     int num = 0,i;

21     st.x = x;

22     st.y = y;

23     vis[x][y] = 1;

24     q.push(st);

25     while(!q.empty())

26     {

27         sd = q.front();

28         int tx = sd.x;

29         int ty = sd.y;

30         q.pop();

31         for(i = 0 ;i < 8 ; i++)

32         {

33             int dx = tx+dis[i][0];

34             int dy = ty+dis[i][1];

35             if(dx>=0&&dx<n&&dy>=0&&dy<m&&!vis[dx][dy])

36             {

37                 vis[dx][dy] = 1;

38                 if(!f[dx][dy]&&o[dx][dy])

39                 num++;

40                 st.x = dx;

41                 st.y = dy;

42                 if(!f[dx][dy]&&!o[dx][dy])

43                 q.push(st);

44             }

45         }

46     }

47     if(num%2==0)

48     return 1;

49     return 2;

50 }

51 int main()

52 {

53     int i,j,t,kk=0;

54     scanf("%d",&t);

55     while(t--)

56     {

57         kk++;

58         scanf("%d%d%d",&n,&m,&k);

59         for(i = 0 ; i <= n ; i++)

60             for(j = 0 ; j  <= m ; j++)

61             {

62                 f[i][j] = 0;

63                 o[i][j] = 0;

64                 vis[i][j] = 0;

65             }

66         while(k--)

67         {

68             int x,y;

69             scanf("%d%d",&x,&y);

70             f[x][y] = 1;

71             for(i = 0 ; i < 8 ; i++)

72             {

73                 int tx = x+dis[i][0];

74                 int ty = y+dis[i][1];

75                 if(tx>=0&&tx<n&&ty>=0&&ty<m)

76                 o[tx][ty] = 1;

77             }

78         }

79         int ans=0;

80         for(i = 0 ; i < n ; i++)

81             for(j = 0 ; j < m ; j++)

82             if(!f[i][j]&&!vis[i][j]&&o[i][j]==0)

83             {

84                 int w = bfs(i,j);

85                 ans ^= w;

86             }

87         for(i = 0 ; i < n ; i++)

88             for(j = 0 ; j < m ; j++)

89             if(!f[i][j]&&!vis[i][j]&&o[i][j])

90             ans ^= 1;

91         printf("Case #%d: ",kk);

92         if(ans==0)

93         printf("Fanglaoshi\n");

94         else

95         printf("Xiemao\n");

96     }

97     return 0;

98 }
View Code

 

你可能感兴趣的:(HDU)