POJ 1753 递归枚举
2016-04-15 17:16
232 查看
#include <iostream> #include <cstdio> #include <cstring> using namespace std; bool chess[6][6]; char tmp; int dr[]={-1,1,0,0,0}; int dc[]={0,0,1,-1,0}; int step,deep; int flag; void fan(int r,int c) \\翻棋子 { int i; for(i=0;i<5;i++) { chess[r+dr[i]][c+dc[i]]=!chess[r+dr[i]][c+dc[i]]; } } int check() \\检查是否符合条件 { int i,j; for(i=1;i<=4;i++) { for(j=1;j<=4;j++) { if(chess[i][j]!=chess[1][1]) { return 0; } } } return 1; } void dfs(int r,int c,int deep) { if(step==deep) \\棋子放满,检查 { flag=check(); return ; } if(flag) return ; \\找到符合,所有递归全部return if(r==5) return; fan(r,c); if(c<4) \\ 用来放置棋子,每放一个棋子,deep加一(一个测试案例) { dfs(r,c+1,deep+1); } else { dfs(r+1,1,deep+1); } fan(r,c); \\进行下个测试案例的时候,要翻回来 if(c<4) \\ 用来移动棋子,更改测试案例,并达到枚举全排列的效果 { dfs(r,c+1,deep); } else { dfs(r+1,1,deep); } } int main() { int i,j; memset(chess,false,sizeof(chess)); for(i=1;i<=4;i++) { for(j=1;j<=4;j++) { cin>>tmp; if(tmp=='b') { chess[i][j]=true; } } } flag=0; for(step=0;step<=16;step++) { dfs(1,1,0); if(flag) break; } if(flag) { printf("%d\n",step); } else { printf("Impossible\n"); } return 0; }
相关文章推荐
- poj3974(manacher)
- Leetcode题解 242. Valid Anagram
- 话说:学好C语言,走遍天下都不怕
- iOS label设置内容为HTML
- WH服务器框架分析系列五:定时器模块CTimerEngine
- 面试题怎么将二叉树转化为链表
- iOS获取当前无线连接的SSID信息和WI-FI名称
- Mock.js 安装 及 使用demo
- openresty 阻塞函数
- 常用正则表达式总结
- MFC双缓冲绘图
- JavaScript 的生产力工具: TypeScript
- JMTER 数据库SQL自动化验证
- 测试管理_下属谈话[持续更新ing]
- [转]Java8 lambda表达式及新特新
- 数据结构(二叉树子系统:c语言实现)
- CSS之清除浮动
- Starling中位图字体的制作与使用
- PhpWord 如何输出换行符到 word?
- Java泛型中的? super T语法