这道题的本质和八数码一样
先定义一个状态
struct st{
int map[4];//把手状态
int num;//步数
vector<int> s;//路径
int a;//身份码
}
大概的步骤
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#define x first
#define y second
using namespace std;
//定义结构体
struct st {
};
st bfs() {
//初始化
queue<st> que;
que.push();
while () {
st t = que.front();
for()
for () {
//制作新元素
if()//满足条件时结束进程;
return
}
que.pop()//删除头元素
}
}
int main() {
//接收数据
for (.....) cin >> ...//
//制作头元素
bfs();//输出结果
}
实际代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#define x first
#define y second
using namespace std;
const int N = 5;
int n = 4;
bool jud[1000000];
typedef pair<int, int> two;
struct st {
int map[N][N];
int num;
int a;
vector<two> s;
}st1;
void clone(int a[][N], int b[][N]) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
a[i][j] = b[i][j];
}
}
void change(int x, int y, int mid[][N]) {
for (int i = 1; i <= n; i++)
mid[i][y] = mid[i][y] ^ 1;
for (int i = 1; i <= n; i++)
mid[x][i] = mid[x][i] ^ 1;
mid[x][y] = mid[x][y] ^ 1;
}
int make(int a[][N]) {
int sum = 0, fur = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
if (a[i][j]) sum += 1 << fur++;
else fur++;
}
return sum;
}
st bfs() {
queue<st> que;
que.push(st1);
while (que.size()) {
st t = que.front();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if(t.s.size())
if (i == t.s.back().x&&j == t.s.back().y)
continue;
st mid;
clone(mid.map, t.map);//map
change(i, j, mid.map);
mid.a = make(mid.map);//a
if (!jud[mid.a]) {
jud[mid.a] = true;
mid.num = t.num + 1;//num
mid.s = t.s;//s
mid.s.push_back({ i,j });
que.push(mid);
if (mid.a == 65535) {
cout << mid.num << endl;
return mid;
}
}
}
}
que.pop();
}
}
int main() {
for(int i=1;i<=n;i++)
for (int j = 1; j <= n; j++) {
char a; cin >> a;
if (a == '-') st1.map[i][j] = 1;
else st1.map[i][j] = 0;
}
st1.a = make(st1.map);
jud[st1.a] = 1;
st1.num = 0;
st it = bfs();
for (int i = 0; i < it.s.size(); i++)
cout << it.s[i].x << ' ' << it.s[i].y << endl;
}