您的位置:首页 > 其它

POJ 1753 Flip Game

2017-01-17 23:33 302 查看
POJ 1753 FlipGame

题目大意:

有4X4的方格,给定初始时每个方格的颜色, 每次可反转一个方格的颜色,与此同时,该方格的上,下,左,右的方格颜色都会反转,即白->黑或者黑->白,求几次选择反转后可使得所有方格为白或者为黑.

解题思路: 每次只能选择一个方格进行反转,这样就总共有16种选择,每一种选择都会产生不同的新状态,可将4X4共16个方格用空间大小为16的一维数组储存,并且让1表示b,0表示w,纯白即为0000 0000 0000 0000,纯黑即为 1111 1111 1111

1111.采取二进制的方式进行压缩 ,则纯黑表示的二进制为65535, 每种状态对应一种二进制即对应一种十进制数,采取bfs进行遍历搜索

代码如下:

/***************
Problem from :poj 1753
Problem describe :
翻转棋
状态压缩+bfs
b为1 w为0
data:2017/1/17
****************/

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<stack>
#include<queue>
#include<ctime>
#include<cstring>
#include<vector>
#include<string>
#define ll __int64
#define inf 0x3f3f3f3f3f
using namespace std;
struct node {
int state;
int step;
};

int vis[65536];//状态标记
int Change[16]{
51200,58368,29184,12544,35968,20032,10016,
4880,2248,1252,626,305,140,78,39,19
};//16种选择,每种选择引起的结果
node next, cur;

int bfs(int state)
{
memset(vis, 0, sizeof(vis));
       if(state == 0 || state == 65535) return 0;
int i;
queue<node>que;
cur.state = state;
cur.step = 0;
vis[state]=1;
que.push(cur);
while(!que.empty())
{
cur = que.front();
que.pop();
if(cur.state == 0 || cur.state == 65535) return cur.step;
for(i=0; i<16; i++)
{
next.state = cur.state ^ Change[i]; //异或产生下一个状态,0^1=1, 1^1=0, 0^0=0, 1^0=1;
next.step = cur.step + 1;
if(vis[next.state]) continue;//该状态已出现过,无须重复
if(next.state == 0 || next.state == 65535) return next.step;//满足条件,退出函数
vis[next.state] = 1;//已使用的要标记
que.push(next);//进队
}
}
return -1;
}

int main()
{
//  freopen("in.txt","r",stdin);
//  freopen("out.txt","w",stdout);
int i, j, n, ans=0, state=0;
char s[5][5];
while(scanf("%s", s[0])!=EOF)
{
state=0;
for(i=1; i<4; i++)
{
scanf("%s", s[i]);
}
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
state <<= 1;
if(s[i][j]=='b') state += 1;
}
}
ans = bfs(state);
if(ans==-1) printf("Impossible\n");
else printf("%d\n", ans);
}
return 0;
}


相似题目:
POJ 2965


POJ 2965 AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
int flag[4][4]={0};
int main()
{
char c;
int i, j, k, ans=0;
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
scanf("%c", &c);
if(c=='+')
{
flag[i][j]=!flag[i][j];
for(k=0; k<4; k++)
{
flag[i][k] = !flag[i][k];
flag[k][j] = !flag[k][j];
}
}
}
getchar();
}
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
if(flag[i][j]) ans++;
}
}
printf("%d\n", ans);
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
if(flag[i][j])
{
printf("%d %d\n", i+1, j+1);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: