自己简答的实现了一个队列
* 当push操作的时候,tail++
* 当pop操作的时候,head++
暂时没有考虑队列满和空的情况
#include <iostream>
#include <string.h>
using namespace std;
int visit[1<<16];
int pre[1<<16];
int Q[1<<16];
// first list the mask
int masks[16] = {
0x111f, 0x222f, 0x444f, 0x888f,
0x11f1, 0x22f2, 0x44f4, 0x88f8,
0x1f11, 0x2f22, 0x4f44, 0x8f88,
0xf111, 0xf222, 0xf444, 0xf888
};
int bfs(int state){
int head = 0;
int tail = 0;
Q[head] = state;
tail++;
int step = 0;
while (tail!=head){
int t = tail-head;
for (int i = 0; i < t; ++i) {
int temp = Q[head++];
if (temp == 0xffff || step>16)
return step;
for (int ix = 0; ix < 16; ++ix) {
int next = temp^masks[ix];
if (visit[next] ==-1){
Q[tail++] = next;
visit[next] = ix;
pre[next] = temp;
}
}
}
step++;
}
return -1;
}
int main(){
// freopen("../in.txt", "r", stdin);
memset(pre, -1, sizeof(pre));
memset(visit, -1, sizeof(visit));
int start = 0;
int k = 0;
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
char a;
cin>>a;
if (a == '-')
start += (1<<k);
k++;
}
}
visit[start] = 1;
pre[start] = -1;
int ans = bfs(start);
cout<<ans<<endl;
if (ans<=16){
int last = 0xffff;
while (pre[last]!=-1){
int a = visit[last];
cout<<a/4+1<<" "<<a%4+1<<endl;
last = pre[last];
}
}
}