您的位置:首页 > 其它

搜索- poj2965 The Pilots Brothers' refrigerator

2015-04-20 17:08 232 查看

题目:

http://poj.org/problem?id=2965

题意:

给定4*4方格,每格中为0或1,当翻转某格时,该格所在行及列随之翻转,求将全部格子变成1的最少步数

思路:

递归搜索

问题:

用单个数字表示,待处理格子的位置;但在转化下标时,/, %运算没有处理好

代码:

#include <stdio.h>
#include <stack>
struct pos{
int x, y;
};
using namespace std;
stack<pos> s;
stack<pos> sTemp;
int check = 0;

int isFinish(int arr[4][4]){
int c = 1;
for (int i = 0; i < 4 && c; ++i)
for (int j = 0; j < 4 && c; ++j){
if (arr[i][j] == 0){
c = 0;
}
}
return c;
}

void search(int arr[4][4],int pos,int x){
if (check) return;
int i = (pos - 1) / 4, j = pos % 4 - 1;
j = j < 0 ? 3 : j;
s.push({ i, j });
arr[i][j] = 1 - arr[i][j];
for (int k = 0; k < 4; ++k){
arr[i][k] = 1 - arr[i][k];
arr[k][j] = 1 - arr[k][j];
}
if (x != 1){
for (int k = pos + 1; k <= 16 - (x - 1) + 1; k++)
search(arr, k, x - 1);
}
else{
if (isFinish(arr)){
check = s.size();
printf("%d\n", check);

while (!s.empty()){
sTemp.push(s.top());
s.pop();
}
while (!sTemp.empty()){
printf("%d %d\n", sTemp.top().x + 1, sTemp.top().y + 1);
sTemp.pop();
}
}
}
if (!s.empty()) s.pop();
arr[i][j] = 1 - arr[i][j];
for (int k = 0; k < 4; ++k){
arr[i][k] = 1 - arr[i][k];
arr[k][j] = 1 - arr[k][j];
}
return;
}

int main(){
int arr[4][4] = { 0 };
for (int i = 0; i < 4; ++i){
char str[5];
scanf("%s", str);
for (int j = 0; j < 4; ++j)
// - open
if (str[j] == '-') arr[i][j] = 1;
}
//in
for (int i = 1; i <= 16; i++){
for (int j = 1; j <= 16 - i + 1; ++j)
search(arr, j, i);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: