请问如何用编程求解,我学习的语言是c++
急需!我已经很久没碰编程了
答案是5
#include <iostream>
#include <cstring>
using namespace std;
const int INF = 0x3f3f3f3f; // 无穷大
int map[4][4]; // 开关状态
// 状态转移函数
void change(int x, int y) {
map[x][y] ^= 1; // 自身状态改变
if (x > 0) map[x - 1][y] ^= 1; // 上方开关状态改变
if (x < 2) map[x + 1][y] ^= 1; // 下方开关状态改变
if (y > 0) map[x][y - 1] ^= 1; // 左边开关状态改变
if (y < 2) map[x][y + 1] ^= 1; // 右边开关状态改变
}
// 模拟翻转过程
int flip() {
int cnt = 0; // 记录翻转次数
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (map[i][j] == 1) { // 如果当前开关为“开”
change(i, j); // 改变开关状态
cnt++; // 计数器加一
}
}
}
// 如果 (1,1) 为“开”,则返回无穷大
if (map[0][0] == 1) return INF;
else return cnt;
}
int main() {
// 读入开关状态
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cin >> map[i][j];
}
}
int ans = INF;
// 枚举第一个开关的状态
for (int s = 0; s < 2; s++) {
memset(map, 0, sizeof(map)); // 初始化开关状态
map[0][0] = s; // 改变开关状态
int cnt = flip(); // 模拟翻转过程
ans = min(ans, cnt); // 取最小值
}
// 输出结果
if (ans == INF) cout << "impossible" << endl;
else cout << ans << endl;
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: