poj1753枚举
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 33670 | Accepted: 14713 |
Description
- 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
to the output file a single integer number - the minimum number of
rounds needed to achieve the goal of the game from the given position.
If the goal is initially achieved, then write 0. If it's impossible to
achieve the goal, then write the word "Impossible" (without quotes).
Sample Input
- bwwb
- bbwb
- bwwb
- bwww
Sample Output
- 4
Source
解析
真是醉了,双重dfs,如果对dfs不是很了解的同学就放弃这道题吧,想了4个小时才想通,脑细胞都快没了,
其实就是step从0枚举到16,之后dfs结构中主要是对每一种可能进行位移式的枚举,一部一部向后推得枚举
附代码
ps:其实本人代码与网上的代码差不多,
本人也是参考网上代码才解决的这道问题
如过有谁不懂可以Q我,1097944404
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
int map[5][5],step,flag;
int judge(){
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 update(int x,int y){
map[x][y]^=1;
if(x>0)
map[x-1][y]^=1;
if(x<3)
map[x+1][y]^=1;
if(y>0)
map[x][y-1]^=1;
if(y<3)
map[x][y+1]^=1;
}
void dfs(int x,int y,int step1){
if(step1==step){
flag=judge();
return ;
}
if(flag||x==4)
return;
update(x,y);
if(y<3)
dfs(x,y+1,step1+1);
else
dfs(x+1,0,step1+1);
update(x,y);
if(y<3)
dfs(x,y+1,step1);
else
dfs(x+1,0,step1);
}
int main(){
char z;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
scanf("%c",&z);
if(z=='b')
map[i][j]=0;
else
map[i][j]=1;
}
getchar();
}
flag=0;
for( step=0;step<=16;step++){
dfs(0,0,0);
if(flag)
break;
}
if(flag)
printf("%d\n",step);
else
printf("Impossible\n");
return 0;
}
、、、、、可以用位运算
把其化成一个整数,最大的时候是65535,最小的时候是0,当时的情况就是全是黑色的或是白色的
用数组标记形成每一个数的时候所需要的次数,当为0或是65535的时候就是正确的答案了,
change函数主要是改变相应的19个位置的某个位置的数,改变成位0或1,update函数同样则是更新改变的那个点和他周围需要改变的点
位运算真的很好用,今天才通过这个题对位运算了解了不少知识!
附代码
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
#include<math.h>
#include<algorithm>
using namespace std;
int ans;
void change(int &t,int j){
t^=(1<<j);
}
int update(int count,int i){
change(count,i);
if(i>3)
change(count,i-4);
if(i<12)
change(count,i+4);
if(i%4!=0)
change(count,i-1);
if(i%4!=3)
change(count,i+1);
return count;
}
void dfs(){
queue<int>q;
int a[65536];
memset(a,0,sizeof(a));
q.push(ans);
while(!q.empty()){
int cnt=q.front();
q.pop();
if(cnt==0||cnt==65535){
printf("%d\n",a[cnt]);
return ;
}
for(int i=0;i<16;i++){
int temp=update(cnt,i);
if(!a[temp]){
a[temp]=a[cnt]+1;
q.push(temp);
}
}
}
printf("Impossible\n");
return ;
}
int main(){
char c;
int temp;
for(int i=0;i<16;i++){
cin>>c;
if(c=='b')
temp=1;
else
temp=0;
ans+=temp<<i;
}
dfs();
return 0;
}
poj1753枚举的更多相关文章
- POJ-1753 Flip Game---二进制枚举子集
题目链接: https://vjudge.net/problem/POJ-1753 题目大意: 有4*4的正方形,每个格子要么是黑色,要么是白色,当把一个格子的颜色改变(黑->白或者白-> ...
- POJ1753 Flip Game(bfs、枚举)
链接:http://poj.org/problem?id=1753 Flip Game Description Flip game is played on a rectangular 4x4 fie ...
- [POJ1753]Flip Game(异或方程组,高斯消元,枚举自由变量)
题目链接:http://poj.org/problem?id=1753 题意:同上. 这回翻来翻去要考虑自由变元了,假设返回了自由变元数量,则需要枚举自由变元. /* ━━━━━┒ギリギリ♂ eye! ...
- poj1753解题报告(枚举、组合数)
POJ 1753,题目链接http://poj.org/problem?id=1753 题意: 有4*4的正方形,每个格子要么是黑色,要么是白色,当把一个格子的颜色改变(黑->白或者白-> ...
- poj-3279 poj-1753(二进制枚举)
题目链接:http://poj.org/problem?id=3279 题目大意: 有一个m*n的棋盘(1 ≤ M ≤ 15; 1 ≤ N ≤ 15),每个格子有两面分别是0或1,每次可以对一个格子做 ...
- 二进制枚举例题|poj1222,poj3279,poj1753
poj1222,poj3279,poj1753 听说还有 POJ1681-画家问题 POJ1166-拨钟问题 POJ1054-讨厌的青蛙
- POJ1753 Flip Game(位运算+暴力枚举)
Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...
- POJ1753(位操作和枚举)
题目:http://poj.org/problem?id=1753 题意:一块4*4的棋盘,黑白块不规律分布,翻动一个色块,其上下左右,都会被翻动,知道全黑全白为止.输出最小次数,达不到则输出“Imp ...
- [POJ1753]Flip Game(开关问题,枚举)
题目链接:http://poj.org/problem?id=1753 和上一个题一样,将初始状态存成01矩阵,就可以用位运算优化了.黑色白色各来一遍 /* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏ ...
随机推荐
- 编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]
前言 泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能.基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托 ...
- Nodejs学习笔记(七)--- Node.js + Express 构建网站简单示例
目录 前言 新建项目.建立数据库以及其它准备工作 新建express + ejs 项目:sampleEjs 创建数据库 修改package.json文件,安装session和mysql模块 样式和JQ ...
- HTML5——多次定位请求
多次定位请求及点击一次 就不断的触发请求事件,和单次定位请求写法差不多,只需要将 navigator.geolocation.getCurrentPosition改为navigator.geoloca ...
- ansible 小试身手
我们安装好了ansible之后 配置了免密码登陆 现在我们可以检查一下管理主机和被管理主机的连通性 ansible all -m ping 在我们的实际生产中我们倾向于使用普通用户用sud ...
- Google-解决在调试页面或者js时总是提示烦恼的断点问题
按F12键,然后切换到Source标签,看底下的那个跟暂停一样的图标是不是变成蓝色或紫色了? 如果是蓝色或者紫色,则把他切换到“灰色”状态(点击图标就会切换成不同的状态.或者可能是其他颜色状态),如下 ...
- BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)
潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...
- firefox与chrome中对select下拉框中的option支持问题
firefox可以直接修改option的字体样式,但是chrome中option的字体样式是继承select的,这个是在项目中遇到的,具体的可以看一下 http://www.cnblogs.com/r ...
- POJ1364 King
Description Once, in one kingdom, there was a queen and that queen was expecting a baby. The queen p ...
- 苹果开发者账号如何多人协作进行开发和真机调试XCode
首先,先说明一下,我们最容易误解或者理解错误的是:p12证书. 其实p12证书,最直接的使用就是,我们在一台电脑上生成好了cer证书之后,如果使用了开发者账号(无论公司或者个人的)进行ipa进行打包和 ...
- POJ2288 Islands and Bridges
Description Given a map of islands and bridges that connect these islands, a Hamilton path, as we al ...