poj 1753练习
来源:互联网 发布:飞控科技软件下载 编辑:程序博客网 时间:2024/06/14 09:45
- 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.
bwwbbbwbbwwbbwww
4
题解:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool arr[4][4]; //w 用 1表示 b用 0 表示即false
const int inf = 10000;
int ans = 10000;
void flip(int x,int y){ //翻转棋子
arr[x][y]=!arr[x][y];
if(x-1>=0)
arr[x-1][y]=!arr[x-1][y];
if(x+1<4)
arr[x+1][y]=!arr[x+1][y];
if(y-1>=0)
arr[x][y-1]=!arr[x][y-1];
if(y+1<4)
arr[x][y+1]=!arr[x][y+1];
}
bool judge() //判断是否达到 全b 或 全w
{
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(arr[i][j] != arr[0][0])
return false;
return true;
}
int dfs(int x,int y,int deep){ //dfs深度搜索
if(judge()){
if(deep < ans)
ans = deep; //ans 保存最小翻转次
return 0;
}
if(x<0 || x>3 || y<0 || y>3)
return 0;
int nx,ny;
nx=(x+1)%4; //相当于按列遍历
ny=y+(x+1)/4;
/*
ny = (y+1)%4; //相当于按行遍历 亦可
nx = x + (y+1)/4;
*/
/*这种写法亦可
上面不需要 利用nx,ny
flip(x,y);
if(y<3)
dfs(x,y+1,deep+1);
else
dfs(x+1,0,deep+1);
fan(x,y);
if(y<3)
dfs(x,y+1,deep);
else
dfs(x+1,0,deep);
*/
flip(x,y);
dfs(nx,ny,deep+1);
flip(x,y);
dfs(nx,ny,deep);
return 0;
}
int main(){
char str[10];
int i,j;
memset(arr,true,sizeof(arr));
for(i=0;i<4;i++)
{
cin >> str;
for(j=0;j<4;j++)
if(str[j] == 'b')
arr[i][j] = false;
}
dfs(0,0,0);
if(ans < inf)
cout << ans << endl;
else
cout << "Impossible" << endl;
return 0;
}
- poj 1753练习
- poj 练习大全
- kmp练习 poj 2541
- poj 3481 treap 练习
- POJ Volume1练习记录
- POJ 3096 SET 练习
- POJ练习历程
- POJ 1002 练习
- BFS练习-POJ.2386
- kmp算法练习 poj 1226 poj 1961
- kmp 练习2 poj 2185 poj 2406
- 【Java练习1】POJ 1131
- 【Java练习3】POJ 1405
- 【Java练习4】POJ 1503
- 【Java练习5】POJ 1604
- 【Java练习6】POJ 2305
- 【Java练习8】POJ 2325
- 【Java练习9】POJ 2389
- 常用的makefile模版
- 题目1477:怪异的洗牌
- android_java.lang.Throwable: Explicit termination method 'end' not called
- android 简单的弹出框(在屏幕中间,传string[],根据内容框框大小自适应)
- 数据结构与算法(二)冒泡&&插入&&选择 简单排序
- poj 1753练习
- 3.Java开发中的23种设计模式详解(转)
- android画一条虚线
- BlockingQueue实现生产者、消费者模式
- JavaScript构造函数及原型属性关系
- Jquery 一个表单多个提交按钮
- TotoiseSVN的基本使用方法
- Ubuntu 更新软件出现 /boot 容量不足的警告错误
- 解决genymotion-arm-translation.zip无法拖拽安装的问题