标签:

4 .X.. .... XX.. .... 2 XX .X 3 .X. X.X .X. 3 ... .XX .XX 4 .... .... .... .... 0
5 1 5 2 4
Zhejiang University Local Contest 2001
DFS深度优先还得多练习啊,下边还有单靠大神的代码用二分图写的代码,第一次用,,只怪自己太菜
//DFS
#include<stdio.h>
#include<string.h>
char mp[8][8];
int n,ans;
int check(int x,int y){
int i;
//判断行是否冲突
for(i=y-1;i>0;i--){
if(mp[x][i]=='#') return 0;
if(mp[x][i]=='X') break;
}
for(i=y+1;i<=n;i++){
if(mp[x][i]=='#') return 0;
if(mp[x][i]=='X') break;
}
//判断列是否冲突
for(i=x-1;i>0;i--){
if(mp[i][y]=='#') return 0;
if(mp[i][y]=='X') break;
}
for(i=x+1;i<=n;i++){
if(mp[i][y]=='#') return 0;
if(mp[i][y]=='X') break;
}
return 1;
}
void dfs(int cnt){
if(cnt>ans) ans=cnt;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(mp[i][j]=='.'&&check(i,j)){
mp[i][j]='#';
dfs(cnt+1);
mp[i][j]='.';
}
}
}
int main(){
int i,j;
while(scanf("%d",&n),n){
for(i=1;i<=n;i++){
getchar();
for(j=1;j<=n;j++){
scanf("%c",&mp[i][j]);
}
}
ans=0;
dfs(0);
printf("%d\n",ans);
}
return 0;
}
//下边是用二分图匹配写的代码
#include<stdio.h>
#include<string.h>
char mp[8][8];
int r[8][8],c[8][8],path[8][8];
int n,rmax,cmax,ruse[8],cuse[8],vis[8];
int Find(int x){
for(int i=1;i<cmax;i++){//在列集合中找到有路径的点
if(!vis[i] && path[x][i]){
vis[i]=1;
if(!cuse[i] || Find(cuse[i])){
cuse[i]=x;//分别赋值
ruse[x]=i;
return 1;
}
}
}
return 0;
}
int main(){
int i,j;
while(scanf("%d",&n),n){
for(i=1;i<=n;i++){
getchar();
for(j=1;j<=n;j++){
scanf("%c",&mp[i][j]);
}
}
memset(r,-1,sizeof(r));
memset(c,-1,sizeof(c));
//缩点
rmax=cmax=1;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(mp[i][j]=='.'&&r[i][j]==-1){//横向缩点
for(int k=j;k<=n&&mp[i][k]=='.';k++)
r[i][k]=rmax;//相同区域标记同一个数字
rmax++;
}
if(mp[j][i]=='.'&&c[j][i]==-1){//纵向缩点
for(int k=j;k<=n&&mp[k][i]=='.';k++)
c[k][i]=cmax;//相同区域标记同一个数字
cmax++;
}
}
}
//连边建立路径图
memset(path,0,sizeof(path));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
if(mp[i][j]=='.'){
path[ r[i][j] ][ c[i][j] ]=1;
}
}
//二分图匹配
int ans=0;
memset(ruse,0,sizeof(ruse));
memset(cuse,0,sizeof(cuse));
for(i=1;i<rmax;i++) {// 行集合中搜索
memset(vis,0,sizeof(vis));
ans+=Find(i);
}
printf("%d\n",ans);
}
return 0;
}hdu 1045 && zoj 1002 Fire Net(DFS && 二分图匹配)
标签:
原文地址:http://blog.csdn.net/ling_du/article/details/47343027