思路:

有过两个裸搜的思路,第一个一个无限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的更多相关文章

  1. poj—1753 (DFS+枚举)

                                                                                                        ...

  2. POJ 1753 Flip Game DFS枚举

    看题传送门:http://poj.org/problem?id=1753 DFS枚举的应用. 基本上是参考大神的.... 学习学习.. #include<cstdio> #include& ...

  3. [ACM训练] 算法初级 之 基本算法 之 枚举(POJ 1753+2965)

    先列出题目: 1.POJ 1753 POJ 1753  Flip Game:http://poj.org/problem?id=1753 Sample Input bwwb bbwb bwwb bww ...

  4. 枚举 POJ 1753 Flip Game

    题目地址:http://poj.org/problem?id=1753 /* 这题几乎和POJ 2965一样,DFS函数都不用修改 只要修改一下change规则... 注意:是否初始已经ok了要先判断 ...

  5. poj 1753 2965

    这两道题类似,前者翻转上下左右相邻的棋子,使得棋子同为黑或者同为白.后者翻转同行同列的所有开关,使得开关全被打开. poj 1753 题意:有一4x4棋盘,上面有16枚双面棋子(一面为黑,一面为白), ...

  6. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  7. 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:// ...

  8. POJ 1753 Flip Game(高斯消元+状压枚举)

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 45691   Accepted: 19590 Descr ...

  9. 穷举(四):POJ上的两道穷举例题POJ 1411和POJ 1753

    下面给出两道POJ上的问题,看如何用穷举法解决. [例9]Calling Extraterrestrial Intelligence Again(POJ 1411) Description A mes ...

随机推荐

  1. 8 switch case

    当一个case成立,从这个case向后穿透所有case,即使后面的case条件不成立 包括default,直到程序结束或者遇到break程序才结束. 1.case是常量,且不能重复 2.表达式可以是b ...

  2. css3的基础知识

    transfrom的应用: 1.旋转:transform: rotate(30deg): 2.阴影效果:box-shadow: 10px 10px 5px #888888: 3.鼠标移入放大:tran ...

  3. git clone下载代码,中途断掉怎么办?

    问题如下: 解决办法: 1)运行以下命令进行clone $ git clone --recursive https:xxxxxx 2)进入项目根目录,继续下载 $ cd eigen-git-mirro ...

  4. DOClever线下部署安装说明文档

    先本地要安装node环境,推荐6.10.0版本 到nodejs官网进行下载window版本进行安装,这里就不做说明了  接下来我们开始安装mongodb,首先下载mongodb  下载完成后我们一路 ...

  5. os、sys模块

    os模块 os模块是与操作系统交互的一个接口 os.makedirs("dirname1/dirname2") # 可生成多层递归目录 os.removedirs("di ...

  6. C语言指针与指向指针的指针

    #include <stdio.h> #include <string.h> int main() { char a[]="hello world"; ch ...

  7. 【codeforces 785E】Anton and Permutation

    [题目链接]:http://codeforces.com/problemset/problem/785/E [题意] 给你一个初始序列1..n顺序 然后每次让你交换任意两个位置上面的数字; 让你实时输 ...

  8. nyoj_37_回文字符串_201403121649

    回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当 ...

  9. 利用Calendar类测试电脑运行速度

    今天学习了很多新知识! 这里使用了Calender类来获取系统时间,并计算循环1w次的时间,判断电脑处理时间. import java.util.Calendar; public class Arra ...

  10. ddl in PL/SQL

    If you write DDL directly in PL/SQL. You will hit error. 1 DECLARE 2 str_sql varchar2(500); 3 begin ...