您的位置:首页 > 其它

noi1816 画家问题(技巧搜索Dfs)

2016-04-18 19:51 447 查看
/*
Problem 画家问题
假设一个ans数组存的是对每一个点的操作 0表示不图 1表示图
那么 对于原图 g 操作第三行时对第一行没有影响 同样往下类似的
所以 假设我们知道了ans的第一行就是最后答案的第一行 那么对于ans的第二行 就必须是的第一行全变成黄色
以此类推 最后检验第n行 是不是全部黄色就好了
所以只需要枚举第一行的所有情况 共2的n次方种情况
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define inff 0x7fffffff
using namespace std;
int n,ans[20][20],g[20][20],tmp[20][20],anss,minn=inff,tot;
char s;
void Printf()//计数 染了几个
{
anss=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(ans[i][j]==1)anss++;
minn=min(minn,anss);
}
void Pai()//根据ans的第一行 逐行染色
{
int i,j,f=0;
memset(tmp,0,sizeof(tmp));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
tmp[i][j]=g[i][j];
for(i=1;i<=n;i++)
{
if(ans[1][i]==1)
{
tmp[1][i]=!tmp[1][i];
tmp[1][i+1]=!tmp[1][i+1];
tmp[1][i-1]=!tmp[1][i-1];
tmp[2][i]=!tmp[2][i];
}
}
for(i=2;i<=n;i++)
for(j=1;j<=n;j++)
if(tmp[i-1][j]==1)
{
tmp[i-1][j]=0;
ans[i][j]=1;
tmp[i][j]=!tmp[i][j];
tmp[i][j+1]=!tmp[i][j+1];
tmp[i][j-1]=!tmp[i][j-1];
tmp[i+1][j]=!tmp[i+1][j];
}
for(i=1;i<=n;i++)//最后检验最后一行是不是恰好全为黄色
if(tmp
[i]==1)f=1;
if(f==0)Printf();
}
void Dfs(int t)//枚举ans的第一行的所有情况
{
if(t>n)
{
for(int i=2;i<=n;i++)
for(int j=1;j<=n;j++)
ans[i][j]=0;
Pai();
return;
}
ans[1][t]=1;Dfs(t+1);
ans[1][t]=0;Dfs(t+1);
}
int main()
{
int i,j;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cin>>s;
if(s=='w')g[i][j]=1;
else g[i][j]=0;
}
Dfs(1);
if(minn<0x7fffffff)cout<<minn;
else cout<<"inf";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: