poj 1753 Flip Game
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 25674 | Accepted: 11093 |
Description
thus changing the color of their upper side from black to white and vice versa. The pieces to be flipped are chosen every round according to the following rules:
- Choose any one of the 16 pieces.
- Flip the chosen piece and also all adjacent pieces to the left, to the right, to the top, and to the bottom of the chosen piece (if there are any).
Consider the following position as an example:
bwbw
wwww
bbwb
bwwb
Here "b" denotes pieces lying their black side up and "w" denotes pieces lying their white side up. If we choose to flip the 1st piece from the 3rd row (this choice is shown at the picture), then the field will become:
bwbw
bwww
wwwb
wwwb
The goal of the game is to flip either all pieces white side up or all pieces black side up. You are to write a program that will search for the minimum number of rounds needed to achieve this goal.
Input
Output
(without quotes).
Sample Input
bwwb
bbwb
bwwb
bwww
Sample Output
4
题目大意就是给一个棋盘,每次可以选一个点进行一次操作,操作的方法就是:把这个点和这个点上下左右的四个点的颜色反一下,就是黑变成白,白变成黑,问最少多少步整个棋盘能变成一个颜色
广度优先搜索,需要注意的是把一个棋盘压缩成一个整数,每一位代表棋盘上的一个棋子,这样就涉及到了位操作,
#include<stdio.h>
#include<queue>
using namespace std; queue<int> q;
bool flag[0x10000];
int step[0x10000];
int calculate(int num, int i)
{
int p = 1<< i;
if(i % 4 != 0)
p |= 1<<(i - 1);
if((i + 1) % 4 != 0)
p |= 1 <<(i + 1);
if(i > 3)
p |= 1 <<(i - 4);
if(i < 12)
p |= 1 <<(i + 4);
return num ^ p;
}
int bfs()
{
while(!q.empty())
{
int num = q.front();
q.pop();
int i;
for(i = 0; i < 16; i++)
{
int new_num = calculate(num, i); if(flag[new_num] != 1)
{
if(new_num == 0 || new_num == 0xffff)
return step[num] + 1;
q.push(new_num);
flag[new_num] = 1;
step[new_num] = step[num] + 1;
}
}
}
return -1;
}
int main()
{
char ch;
int num = 0;
int i = 16;
// freopen("test.txt", "r", stdin);
while(i--)
{
scanf("%c", &ch);
// memset(flag, 0, sizeof(flag));
if(ch == '\n' || ch == ' ')
{
i++;
continue;
}
num <<= 1;
if(ch == 'w')
num++;
}
flag[num] =1;
q.push(num);
step[num] = 0;
if(num == 0 || num == 0xffff)
{
printf("0\n");
return 0;
}
int t = bfs();
if(t != -1)
printf("%d\n", t);
else
printf("Impossible\n"); return 0;
}
poj 1753 Flip Game的更多相关文章
- 枚举 POJ 1753 Flip Game
题目地址:http://poj.org/problem?id=1753 /* 这题几乎和POJ 2965一样,DFS函数都不用修改 只要修改一下change规则... 注意:是否初始已经ok了要先判断 ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- POJ 1753 Flip Game(高斯消元+状压枚举)
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45691 Accepted: 19590 Descr ...
- OpenJudge/Poj 1753 Flip Game
1.链接地址: http://bailian.openjudge.cn/practice/1753/ http://poj.org/problem?id=1753 2.题目: 总时间限制: 1000m ...
- POJ 1753 Flip Game DFS枚举
看题传送门:http://poj.org/problem?id=1753 DFS枚举的应用. 基本上是参考大神的.... 学习学习.. #include<cstdio> #include& ...
- POJ 1753 Flip Game(状态压缩+BFS)
题目网址:http://poj.org/problem?id=1753 题目: Flip Game Description Flip game is played on a rectangular 4 ...
- poj 1753 Flip Game 枚举(bfs+状态压缩)
题目:http://poj.org/problem?id=1753 因为粗心错了好多次……,尤其是把1<<15当成了65535: 参考博客:http://www.cnblogs.com/k ...
- POJ 1753 Flip Game (DFS + 枚举)
题目:http://poj.org/problem?id=1753 这个题在開始接触的训练计划的时候做过,当时用的是DFS遍历,其机制就是把每一个棋子翻一遍.然后顺利的过了.所以也就没有深究. 省赛前 ...
- POJ 1753 Flip Game(二进制枚举)
题目地址链接:http://poj.org/problem?id=1753 题目大意: 有4*4的正方形,每个格子要么是黑色,要么是白色,当把一个格子的颜色改变(黑->白或者白->黑)时, ...
- POJ 1753 Flip Game(bfs+位压缩运算)
http://poj.org/problem?id=1753 题意:一个4*4的棋盘,只有黑和白两种棋子,每次翻转一个棋子,并且其四周的棋子也跟着翻转,求棋盘全为黑或全为白时所需的最少翻转次数. 思路 ...
随机推荐
- 必须Mark!43个优秀的Swift开源项目推荐
摘要:拥有着苹果先天生态优势的Swift自发布以来,各种优秀的开源项目便层出不穷.本文作者站在个人的角度,将2014年Swift开源项目做了一个甄别.筛选,从工具.存储.网络.界面.框架到Demo以及 ...
- selenium+python自动化之登录案例
一.登录 1.先打开浏览器 2.打开论坛主页:http://www.hordehome.com/ 3.查找元素之前可以先设置元素等待:implicitly_wait() 4.点登录按钮,弹出登录框 5 ...
- DBA常用SQL之表空间与数据文件
)), ) ts_size from dba_tablespaces t, dba_data_files d where t.tablespace_name = d.tablespace_name g ...
- Java 权限修饰符
Java应用有很多类,但有些类并不希望被其他类使用.每个类中都有数据成员和方法成员,但是并不是每个数据和方法,都允许在其他类中调用.如何能做到访问控制呢?就需要使用访问权限修饰符. Java语言中的访 ...
- MongoDB备份与导入
导出mongodb的数据 mongodump -d nodes -o url 导入mongodb数据mongorestore --db nodes url 删除mongodb的数据库db.dropDa ...
- JSP的Servlet监听器
JSP的Servlet监听器 来源: http://blog.csdn.net/phoenix_17th/article/details/3868670 Servlet 监听器用于监听一些重要事件的发 ...
- js 编号生成器
编号生成器 前缀: 后缀: 位数: 连续数字 随机字符 范围: ~ 过滤字符: 多个使用,号分割 0123456789 abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLM ...
- 剑指offer系列49--求1+2+...+N的和
[题目]求1+2+3+…+n, * 要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). package com.exe10.offer ...
- bootstrap中datetimepicker只选择月份显示1899问题
直接修改bootstrap-datetimepicker.js中 update: function () { var date, fromArgs = false; if (arguments &am ...
- db4o种纯对象数据库引擎
db4o是一种纯对象数据库,相对于传统的关系数据库+ORM,db4o具有以下好处:1)以存对象的方式存取数据(废话--,不过你考虑一下完全以对象的方式去考虑数据的存取对传统的数据库设计思维来说是多么大 ...