POJ 1753 DFS
思路:
有过两个裸搜的思路,第一个一个无限TLE,第二个还不慢。。。
错误思路:迭代加深搜索,枚举翻第几个棋,挂的原因:16的16次方,不挂就怪了。
错误代码见下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
char q[6][6],vis[6][6],flag=false;
int tot=0,ans=0x3f3f3f3f,xx[]={1,-1,0,0,0},yy[]={0,0,1,-1,0},ansb,answ,step;
void dfs(int a,int b,int an_b,int an_w,int t)
{
if(an_b==16||an_w==16){flag=1;return;}
if(flag||t==step) {return;}
for(int dx=1;dx<=4;dx++){
for(int dy=1;dy<=4;dy++){//错误的枚举
if(vis[dx][dy])continue;
for(int i=0;i<=4;i++)
{
if(q[dx+xx[i]][dy+yy[i]]=='b')an_b--,an_w++,q[dx+xx[i]][dy+yy[i]]='w';
else if(q[dx+xx[i]][dy+yy[i]]=='w')an_w--,an_b++,q[dx+xx[i]][dy+yy[i]]='b';
}
vis[dx][dy]=1;
// printf("dx=%d dy=%d an_b=%d an_w=%d\n",dx,dy,an_b,an_w);
dfs(dx,dy,an_b,an_w,t+1);
vis[dx][dy]=0;
for(int i=0;i<=4;i++){
if(q[dx+xx[i]][dy+yy[i]]=='w')an_w--,an_b++,q[dx+xx[i]][dy+yy[i]]='b';
else if(q[dx+xx[i]][dy+yy[i]]=='b')an_b--,an_w++,q[dx+xx[i]][dy+yy[i]]='w';
}
}
}
}
int main()
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
cin>>q[i][j];
if(q[i][j]=='b') ansb++;
else if(q[i][j]=='w') answ++;
}
}
for(step=0;step<=15;step++)
{
memset(vis,0,sizeof(vis));
dfs(1,1,ansb,answ,0);
if(flag) {
printf("%d",step);
break;
}
}
if(!flag)printf("Impossible");
}
正确思路(但不是最好的思路):
枚举翻或者不翻。2^16,可以接受
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
char q[6][6];
int map[17][3];
int tot=0,xx[]={1,-1,0,0,0},yy[]={0,0,1,-1,0},ansb,answ,flag=0x3f3f3f;
void dfs(int t,int an_b,int an_w,int flip)
{
if(an_b==0||an_w==0)flag=min(flag,flip);
if(t>tot) return;
int dx=map[t][1],dy=map[t][2];
dfs(t+1,an_b,an_w,flip);
for(int i=0;i<=4;i++)
if(q[dx+xx[i]][dy+yy[i]]=='b')an_b--,an_w++,q[dx+xx[i]][dy+yy[i]]='w';
else if(q[dx+xx[i]][dy+yy[i]]=='w')an_w--,an_b++,q[dx+xx[i]][dy+yy[i]]='b';
dfs(t+1,an_b,an_w,flip+1);
for(int i=0;i<=4;i++)
if(q[dx+xx[i]][dy+yy[i]]=='b')an_b--,an_w++,q[dx+xx[i]][dy+yy[i]]='w';
else if(q[dx+xx[i]][dy+yy[i]]=='w')an_w--,an_b++,q[dx+xx[i]][dy+yy[i]]='b';
}
int main()
{
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++){
cin>>q[i][j];
if(q[i][j]=='b') ansb++;
else if(q[i][j]=='w') answ++;
}
for(int j=1;j<=4;j++){
for(int i=1;i<=4;i++){
tot++;
map[tot][1]=j;
map[tot][2]=i;
}
}
dfs(1,ansb,answ,0);
if(flag==0x3f3f3f)printf("Impossible");
else printf("%d\n",flag);
}
POJ 1753 DFS的更多相关文章
- poj—1753 (DFS+枚举)
...
- POJ 1753 Flip Game DFS枚举
看题传送门:http://poj.org/problem?id=1753 DFS枚举的应用. 基本上是参考大神的.... 学习学习.. #include<cstdio> #include& ...
- [ACM训练] 算法初级 之 基本算法 之 枚举(POJ 1753+2965)
先列出题目: 1.POJ 1753 POJ 1753 Flip Game:http://poj.org/problem?id=1753 Sample Input bwwb bbwb bwwb bww ...
- 枚举 POJ 1753 Flip Game
题目地址:http://poj.org/problem?id=1753 /* 这题几乎和POJ 2965一样,DFS函数都不用修改 只要修改一下change规则... 注意:是否初始已经ok了要先判断 ...
- poj 1753 2965
这两道题类似,前者翻转上下左右相邻的棋子,使得棋子同为黑或者同为白.后者翻转同行同列的所有开关,使得开关全被打开. poj 1753 题意:有一4x4棋盘,上面有16枚双面棋子(一面为黑,一面为白), ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题
http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...
- POJ 1753 Flip Game(高斯消元+状压枚举)
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45691 Accepted: 19590 Descr ...
- 穷举(四):POJ上的两道穷举例题POJ 1411和POJ 1753
下面给出两道POJ上的问题,看如何用穷举法解决. [例9]Calling Extraterrestrial Intelligence Again(POJ 1411) Description A mes ...
随机推荐
- PostgreSQL使用总结
最近项目用到了PostgreSQL数据库,网上一堆教程,这里自己整理一下做个笔记: 1,下载安装,我这边安装在Windows7,在这里找到大象一样的标志: 2,双击打开,这里的话按流程直接走: 3,这 ...
- SSH远程执行命令环境变量问题
SSH命令格式 usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address: ...
- Linux之iptables(三、命令--->单主机)
iptables命令规则格式: iptables [-t table] SUBCOMMAND chain [-m matchname[per-match-options]] -j targetname ...
- C库的制作
1.库的概念:库是一种可执行的二进制形式: 2.分类: 1>静态库 ①.在程序编译时会被连接到目标代码中: ②.程序运行时不再需要该静态库: ③.体积较大: 2>动态库/共享库 ①.在程序 ...
- bx值
bx值 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Problem De ...
- 前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生成相应的响应发送到客户端。前端控制器既可以使用Filter实现(Struts2采用这种方式),也可以使用Servlet来实现(spring MVC框架)。
本文转自http://www.cnblogs.com/davidwang456/p/4090058.html 感谢作者 前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并 ...
- 关于压缩软件gzip和xz的简单对照
晚上因为处理磁盘报警的须要.进行了日志压缩,在此次压缩中分别使用了gzip和xz软件对文本进行了压缩.压缩的结果很令人诧异. 出于对xz好奇的原因是因为在下载内核源码时常常能够看到.xz格式的文件包. ...
- CF #329 D
D题,LCA是很明显的.要注意的是,因为是除法,所以最多可以除x>2的有64次,当大于64时可以直接返回0.而且注意到可能会有很多值为1的边,可以使用路径压缩,把边为1的边压缩掉,类似于并查集的 ...
- 将XML文件转化成NSData对象
NSData *xmlData = [[NSData alloc]initWithContentsOfFile:[NSString stringWithFormat:@"%@/People. ...
- Uva 1331 - Minimax Triangulation(最优三角剖分 区间DP)
题目大意:依照顺时针或者逆时针的顺序给出多边的点,要将这个多边形分解成n-2个三角形,要求使得这些三角行中面积最大的三角形面积尽量小,求最小值. 思路:用区间DP能够非常方便解决,多边形可能是凹边形, ...