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进行遍历搜索
代码如下:
相似题目:
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;
}
题目大意:
有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;
}
相关文章推荐
- 解题报告:POJ 1753 Flip Game 简单深搜dfs
- poj 1753 Flip Game (高斯消元)
- POJ 1753 Flip Game 解题报告(高斯消元法)
- poj1753 Flip Game
- poj 1753 Flip Game(高斯消元)
- [ACM] POJ 1753 Flip Game (枚举,BFS,位运算)
- POJ 1753 Flip Game(翻牌)
- POJ 1753 Flip Game【翻转棋盘+枚举+dfs】
- POJ训练计划1753_Flip Game(枚举+BFS)
- POJ 1753 Flip Game(bfs枚举+递推)
- POJ 1753 Flip Game 高斯消元
- POJ 1753 Flip game ( 高斯消元枚举自由变量)
- poj 1753 Flip Game(广搜)
- POJ 1753 Flip Game (枚举)
- POJ 1753 Flip Game【翻转棋盘+枚举+dfs】
- poj1753 Flip Game
- POJ 1753 Flip Game 翻转(枚举+dfs)
- POJ 1753 Flip Game
- POJ - 1753 Flip Game
- POJ 1753 Flip Game(状态压缩)