pku 2446 Chessboard

题目:http://poj.org/problem?id=2446

本题和hdu1507类似,具体解释:http://www.cnblogs.com/lujiacheng/archive/2011/07/25/2116247.html

代码:

View Code
 1 #include<stdio.h>
2 #include<string.h>
3 #define maxn 51
4 int dx[]={-1,1,0,0};
5 int dy[]={0,0,-1,1};
6
7 int n,m,k,ans;
8 int a[maxn][maxn],mark[maxn*maxn];
9 bool map[maxn*maxn][maxn*maxn],visit[maxn*maxn],hash[maxn][maxn];
10 void get_map()
11 {
12 int i,j,k,x,y,cnt=1;
13 for(i=1;i<=n;i++)
14 for(j=1;j<=m;j++)
15 if(!hash[i][j])
16 {
17 a[i][j]=cnt;
18 cnt++;
19 }
20 memset(map,0,sizeof(map));
21 for(i=1;i<=n;i++)
22 for(j=1;j<=m;j++)
23 if(!hash[i][j])
24 for(k=0;k<4;k++)
25 {
26 x=i+dx[k];
27 y=j+dy[k];
28 if(x>=1&&x<=n&&y>=1&&y<=m&&!hash[x][y])
29 {
30 map[a[i][j]][a[x][y]]=1;
31 map[a[x][y]][a[i][j]]=1;
32 }
33
34 }
35 }
36
37 bool dfs(int k)
38 {
39 int i,j,l;
40 for(i=1;i<=n;i++)
41 for(j=1;j<=m;j++)
42 if(!hash[i][j]&&(i+j)%2==0)
43 {
44 l=a[i][j];
45 if(map[k][l]&&!visit[l])
46 {
47 visit[l]=1;
48 if(mark[l]==-1||dfs(mark[l]))
49 {
50 mark[l]=k;
51 return 1;
52 }
53 }
54 }
55 return 0;
56 }
57
58 bool solve()
59 {
60 int i,j,num=0;
61 memset(mark,-1,sizeof(mark));
62 for(i=1;i<=n;i++)
63 for(j=1;j<=m;j++)
64 {
65 memset(visit,0,sizeof(visit));
66 if(!hash[i][j]&&(i+j)%2==1&&dfs(a[i][j]))
67 {
68 num++;
69 }
70 }
71 if(num*2==ans)
72 return 1;
73 return 0;
74 }
75
76 int main()
77 {
78 int x,y;
79 while(scanf("%d%d%d",&n,&m,&k)!=EOF)
80 {
81 ans=n*m-k;
82 memset(hash,0,sizeof(hash));
83 while(k--)
84 {
85 scanf("%d%d",&x,&y);
86 hash[y][x]=1;
87 }
88 get_map();
89 if(solve())
90 printf("YES\n");
91 else
92 printf("NO\n");
93 }
94 return 0;
95 }

  

原文地址:https://www.cnblogs.com/lujiacheng/p/2117968.html