tyvj1035棋盘覆盖

来源:互联网 发布:陌生网友找我淘宝开店 编辑:程序博客网 时间:2024/05/16 00:42

http://www.tyvj.cn/p/1035

P1035 棋盘覆盖        

                时间: 1000ms / 空间: 131072KiB / Java类名: Main            

描述

                        给出一张n*n(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少1*2的多米诺骨牌进行掩盖。                    

输入格式

                        第一行为n,m(表示有m个删除的格子)
第二行到m+1行为x,y,分别表示删除格子所在的位置
x为第x行
y为第y列                     

输出格式

                        一个数,即最大覆盖格数                    

测试样例1

输入

8 0

输出

32

 

#include<iostream>#include<cstdio>#include<cstring>#define maxn 105#define maxm 10005using namespace std;const int vx[4]={0,0,1,-1};const int vy[4]={1,-1,0,0};int n,m,link[maxm],cmap[maxm][maxn];int intmap[maxn][maxn],ans;bool map[maxn][maxn],vis[maxm];bool dfs(int s){for(int i=1;i<=cmap[s][0];i++)if(!vis[cmap[s][i]]){vis[cmap[s][i]]=true;if(link[cmap[s][i]]==-1||dfs(link[cmap[s][i]])){link[cmap[s][i]]=s;return true;}}return false;}int main(){memset(map,true,sizeof map);memset(cmap,0,sizeof cmap);ans=0;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)intmap[i][j]=i+(j-1)*n;for(int i=0;i<m;i++){int x,y;scanf("%d%d",&x,&y);map[x][y]=false;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(map[i][j]){int point=intmap[i][j];for(int a=0;a<4;a++){int x=i+vx[a];int y=j+vy[a];if(x>0&&x<=n&&y>0&&y<=n&&map[x][y]){int u=intmap[x][y];cmap[point][0]++;cmap[point][cmap[point][0]]=u;}}}memset(link,-1,sizeof link);for(int i=1;i<=n*n;i++)if(cmap[i][0]){memset(vis,false,sizeof vis);if(dfs(i))ans++;}printf("%d\n",ans/2);return 0;}


 

0 0
原创粉丝点击