您的位置:首页 > 其它

pku 2446 Chessboard

2011-07-27 10:38 246 查看
题目:http://poj.org/problem?id=2446

本题和hdu1507类似,具体解释:/article/5651541.html

代码:

View Code

#include<stdio.h>
#include<string.h>
#define maxn 51
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};

int n,m,k,ans;
int a[maxn][maxn],mark[maxn*maxn];
bool map[maxn*maxn][maxn*maxn],visit[maxn*maxn],hash[maxn][maxn];
void get_map()
{
int i,j,k,x,y,cnt=1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(!hash[i][j])
{
a[i][j]=cnt;
cnt++;
}
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(!hash[i][j])
for(k=0;k<4;k++)
{
x=i+dx[k];
y=j+dy[k];
if(x>=1&&x<=n&&y>=1&&y<=m&&!hash[x][y])
{
map[a[i][j]][a[x][y]]=1;
map[a[x][y]][a[i][j]]=1;
}

}
}

bool dfs(int k)
{
int i,j,l;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(!hash[i][j]&&(i+j)%2==0)
{
l=a[i][j];
if(map[k][l]&&!visit[l])
{
visit[l]=1;
if(mark[l]==-1||dfs(mark[l]))
{
mark[l]=k;
return 1;
}
}
}
return 0;
}

bool solve()
{
int i,j,num=0;
memset(mark,-1,sizeof(mark));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
memset(visit,0,sizeof(visit));
if(!hash[i][j]&&(i+j)%2==1&&dfs(a[i][j]))
{
num++;
}
}
if(num*2==ans)
return 1;
return 0;
}

int main()
{
int x,y;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
ans=n*m-k;
memset(hash,0,sizeof(hash));
while(k--)
{
scanf("%d%d",&x,&y);
hash[y][x]=1;
}
get_map();
if(solve())
printf("YES\n");
else
printf("NO\n");
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: