思路:
从初始状态开始dfs,可以减少搜索量,不然逆向bfs可能会超时
#include<iostream>
#include<algorithm>
#include<queue>
#include<utility>
#include<vector>
#include<string.h>
using namespace std;
int trans[16] = {0x111f,0x222f,0x444f,0x888f,
0x11f1,0x22f2,0x44f4,0x88f8,
0x1f11,0x2f22,0x4f44,0x8f88,
0xf111,0xf222,0xf444,0xf888};
pair<int,int> prec[1<<16];//状态转移数组,记录跳转到i的前一状态
queue<int> q;
vector<int> v;
void proc(int init)
{
while (!q.empty())
q.pop();
q.push(init);
memset(prec, -1, sizeof(prec));
prec[init] = make_pair(65566, 65566);
while (!q.empty())
{
int c = q.front();
q.pop();
bool f = false;
for (int i = 0;i < 16;i++)
{
int nc = c^trans[i];//跳转到后一状态
if (prec[nc].first==-1)
{
prec[nc] = make_pair(c, i);
q.push(nc);
if (nc == (1 << 16) - 1)
{
f = true;
break;
}
}
}
if (f)
break;
}
}
int main()
{
char c;
while (cin >> c)
{
int a = 0;
if (c == '-')
a += 1 << 15;
for (int i = 14;i >= 0;i--)
{
cin >> c;
if (c == '-')
{
a += 1 << i;
}
}
proc(a);
int num = 0;
v.clear();
int tc = (1 << 16) - 1;
while (tc != a)
{
v.push_back(15-prec[tc].second);//位置序号需要调整
tc = prec[tc].first;
num++;
}
cout << num << endl;
reverse(v.begin(), v.end());
for (int i = 0;i < v.size();i++)
{
cout << (v[i] / 4 + 1) << " " << (v[i] % 4 + 1) << endl;
}
}
return 0;
}