您的位置:首页 > 其它

POJ 1753 Flip Game 棋盘状态搜索

2016-08-13 14:26 387 查看
按规则翻转棋子的模拟题。也是一道搜索题

题意:给出一个棋盘的初始状态,翻动一粒棋子会使得翻动的棋子和周围东南西北四个方向上的棋子也会翻转。black to white , white to black

传送门:POJ-1753-Flip Game

/**
* @Author: Hallbow
* @Date:   2016-07-22T11:04:59+08:00
* @Email:  812966736@qq.com
* @Last modified by:   Hallbow
* @Last modified time: 2016-08-01T11:01:02+08:00
*/
#include <stdio.h>
#define INF 0xFFFFFF

bool map[4][4] = {0};
bool vis[4][4] = {0};
int minSteps = INF;

// 是否已全白全黑
bool checkMap(){
for(int i=0; i<4; i++){
for(int j=0; j<4; j++){
if(map[i][j] != map[0][0]){
return false;
}
}
}
return true;
}

// 翻转(x,y)
void converseMap(int x, int y){
if(x > 0) map[x-1][y] = !map[x-1][y];
if(x < 3) map[x+1][y] = !map[x+1][y];
if(y > 0) map[x][y-1] = !map[x][y-1];
if(y < 3) map[x][y+1] = !map[x][y+1];
map[x][y] = !map[x][y];
}

// dfs
void dfs(int x, int y, int steps){
// 若已到第四行 check是否胜利
if(x == 4){
if(checkMap()){
if(steps < minSteps) minSteps = steps;
}
return;
}
int i,j;

// 翻
converseMap(x, y);
// 换行
if(y == 3){
// 下个棋子
dfs(x+1, 0, steps+1);
// 回溯 不翻
converseMap(x, y);
// 下一棋子
dfs(x+1, 0, steps);
}else{
dfs(x, y+1, steps+1);
converseMap(x, y);
dfs(x, y+1, steps);
}
}

int main(){
int i,j;
char _map[5];
// freopen("data.in", "r", stdin);
while(1){
minSteps = INF;
for(i=0; i<4; i++){
if(scanf("%s", _map) == EOF) return 0;
for(j=0; _map[j]; j++){
map[i][j] = _map[j] == 'b' ? true: false;
}
}
dfs(0, 0, 0);
if(minSteps != INF){
printf("%d\n", minSteps);
}else{
printf("Impossible\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 搜索