此题我用的是枚举+BFS,虽然时间有点慢(G++ 500ms),但自己还是挺满意的,以后再慢慢改进吧,下面贴代码,供自己以后查看
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
struct st
{
int cur,choose,step;
}w,tmp;
const int maxn=(1<<16);
int ans;
void BFS()
{
queue<st>q;
int i;
q.push(w);
while(!q.empty())
{
w=q.front();
q.pop();
if(w.cur==0)
{
ans=w.choose;
printf("%d\n",w.step);
}
//此处很关键,没有这个处理之前超时
for(i=15;i>=0;i--)
if(w.choose&(1<<i))
break;
for(i++;i<16;i++)
{
if(w.choose&(1<<i))
continue;
tmp=w;
tmp.step++;
tmp.choose|=(1<<i);
int y=i%4;
int x=i/4;
for(int j=0;j<4;j++)
tmp.cur=tmp.cur^(1<<(4*x+j))^(1<<(4*j+y));
tmp.cur^=(1<<i);
q.push(tmp);
}
}
}
int main()
{
char ch;
while(cin>>ch)
{
w.cur=w.choose=w.step=0;
if(ch=='+')
w.cur|=1;
for(int i=1;i<16;i++)
{
cin>>ch;
if(ch=='+')
w.cur|=(1<<i);
}
BFS();
for(int x=0;x<4;x++)
for(int y=0;y<4;y++)
if(ans&(1<<(4*x+y)))
printf("%d %d\n",x+1,y+1);
}
return 0;
}