您的位置:首页 > 其它

广度优先搜索-Shredding Company(算法基础 第8周)

2016-06-19 20:29 483 查看
问题描述:





分析

没想到怎么用广搜做呀,直接枚举了,做法跟熄灯问题 一样。

源码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int field[5][6],filp[5][6];

/*
推测验证过程:
根据第一行猜测
*/
int guess() {
//根据filp第1行和field数组,计算press其他行的值
for (int r=1; r<4; r++) {
for (int c=1; c<=4; c++) {
filp[r+1][c]=(field[r][c]+filp[r][c]+filp[r-1][c]+filp[r][c-1]+filp[r][c+1])%2;
}
}
//判断所计算的press数组能否将最后一行全变为黄色0
for(int c=1; c<=4; c++) {
if ((filp[4][c-1]+filp[4][c]+filp[4][c+1]+filp[3][c])%2 != field[4][c]) {
return 1001;
}
}
//算出需要的步数
int steps=0;
for (int r=1; r<=4; r++) {
for (int c=1; c<=4; c++) {
if (filp[r][c]==1) {
steps++;
}
}
}
return steps;
}

/*
枚举过程:
对press第1行的元素press[1][1]~press[1][6]的各种取值进行枚举
*/
int enumerate() {
int minsteps=1001;
int steps=0;
int c;
while (filp[1][5]<1){
steps = guess();
if (steps<minsteps){
minsteps = steps;
}
filp[1][1]++;
c=1;
while(filp[1][c]>1) {
filp[1][c]=0;
c++;
filp[1][c]++;
}
}
return minsteps;
}

int main() {
//初始化
memset(field, 0, sizeof(field));
memset(filp, 0, sizeof(filp));
//输入数据
char color;
for (int i=1; i<=4; i++) {
for (int j=1; j<=4; j++) {
cin >> color;
field[i][j] = color=='b' ? 0:1;
}
}
int minsteps_first = enumerate();

memset(filp, 0, sizeof(filp));
for (int i=1; i<=4; i++) {
for (int j=1; j<=4; j++) {
field[i][j] = 1-field[i][j];
}
}
int minsteps_second = enumerate();

int minsteps=min(minsteps_first, minsteps_second);
if (minsteps>1000){
cout << "Impossible" << endl;
}
else {
cout << minsteps << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: