Flip Game POJ1753
来源:互联网 发布:东莞网络问政平台 编辑:程序博客网 时间:2024/06/05 14:45
http://poj.org/problem?id=1753;
首先要想到所有情况可以穷尽,可以用枚举。答案范围为0~16步,列出1,2....16步的所有可能,如果存在正确情况就输出结束程序,否则一直枚举到16步为止。核心枚举思想是让每一个棋子都做一次第一步操作的棋子。
#include <stdio.h>
#include <iostream>
using namespace std;
int flag,Map[4][4],step;
int range()
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(Map[i][j]!=Map[0][0]) return 0;
return 1;
}
void turn(int i,int j)
{
Map[i][j]=!Map[i][j];
if(i>0) Map[i-1][j]=!Map[i-1][j];
if(i<3) Map[i+1][j]=!Map[i+1][j];
if(j>0) Map[i][j-1]=!Map[i][j-1];
if(j<3) Map[i][j+1]=!Map[i][j+1];
}
void DFS(int i,int j,int dp)
{
if(dp==step){
flag=range();
return;
}//比如这次要枚举3步的所有情况,dp表示已经操作的步数,当dp==step==3时,判断条件是否达成(即flag的赋值)
if(flag||i==4) return;//如果上一步达成条件或已枚举所有情况则结束程序;
turn(i,j);
if(j<3) DFS(i,j+1,dp+1);
else DFS(i+1,0,dp+1);//第一个turn表示让这个位置的棋子作为当前dp步的棋子;
turn(i,j);
if(j<3) DFS(i,j+1,dp);
else DFS(i+1,0,dp);/第二个turn表示让这个棋子还原,让它的下一个位置作为dp步的棋子;
return;考虑到枚举完都找不到的情况,用这句话退出,其实可以去掉,写上去好理解;
}
int main()
{
char c;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
scanf(" %c",&c);
if(c=='b') Map[i][j]=1;
else Map[i][j]=0;
}
for(step=0;step<=16;step++)
{
flag=0;
DFS(0,0,0);
if(flag) break;
}
if(flag) printf("%d\n",step);
else printf("Impossible\n");
}
- poj1753 Flip Game
- poj1753 Flip Game
- poj1753 Flip Game
- poj1753 flip game题解
- POJ1753 Flip Game
- POJ1753-Flip Game
- poj1753 - Flip Game
- POJ1753 Flip Game
- poj1753 Flip Game
- POJ1753 Flip Game
- poj1753:Flip Game
- POJ1753 Flip Game【DFS】
- poj1753-Flip Game
- poj1753 Flip Game 广搜哈希
- poj1753--Flip Game
- poj1753 Flip Game
- POJ1753:Flip Game
- POJ1753 Flip Game 枚舉
- FiddlerScript学习一:修改Request或Response
- how to build a cgal program in qt under ubuntu
- 模板类的继承
- 1076. Forwards on Weibo (30)
- 1077. Kuchiguse (20)
- Flip Game POJ1753
- 1078. Hashing (25)
- 什么是概念学习?
- 1079. Total Sales of Supply Chain (25)
- Fiddler 扩展编程——oSession相关方法
- Fiddler 高级用法:Fiddler Script 与 HTTP 断点调试
- DB9 串口母对母转接头是个坑
- ytrety
- 刷leetcode小记2——array(122)