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"; }
相关文章推荐
- maven编译zepplin源码_win10
- Oracle数据库获取其中的数据和分页
- 最近点对问题
- 同门腾讯面试遇到的问题
- guava字符串处理——连接器[Joiner]
- Login failed:make sure your username and password are correct and that you’re an admin or moderator
- linux下dd命令详解及应用实例
- 29. 方法链接
- 团队作业(2)
- 接口与抽象类
- 2016/4/18运营面经
- 148. Sort List
- String、StringBuffer与StringBuilder之间区别
- OOM详解
- 第一冲刺阶段站立会议02
- innerHTML和innerText的区别
- 一个TextView显示多个颜色
- ViewPager无限自动轮播
- TOYS--POJ2318
- <松本行弘的程序世界> 读书笔记