BFS爆搜+状压判重
很少见到水题啦。
这题n=4那肯定状压吧,分析一下时间复杂度。
最多状态
217−1=131071
每一次搜索,极端情况
42∗4=64
乘起来妥妥的,
自信满满写完就交上去。结果还WA了一下,手残没办法
#include<cstdio>
#include<queue>
using namespace std;
int in()
{
char c=getchar();
while(c!='0'&&c!='1')c=getchar();
return c-'0';
}
queue<int> q;
int vis[1<<18];
int map[10][10], dx[4]={0,0,1,-1}, dy[4]={1,-1,0,0};
void unpack(int x)
{
for(int i = 4; i >= 1; i--)
for(int j = 4; j >= 1; j--)
{
map[i][j]=(x&1);
x>>=1;
}
}
int pack()
{
int r=0;
for(int i = 1; i <= 4; i++)
for(int j = 1; j <= 4; j++)
r=(r<<1)|map[i][j];
return r;
}
int main()
{
int a=0, b=0;
for(int i = 1; i <= 16; i++)
a=(a<<1)|in();
for(int i = 1; i <= 16; i++)
b=(b<<1)|in();
q.push(a);
vis[a]=1;
while(!q.empty())
{
int x=q.front();
if(x==b){printf("%d\n",vis[x]-1);break;}
q.pop();
unpack(x);
for(int i = 1; i <= 4; i++)
for(int j = 1; j <= 4; j++)
if(map[i][j])
for(int k = 0; k < 4; k++)
{
int nx=i+dx[k], ny=j+dy[k];
if(map[nx][ny] || nx<1 || ny<1 || nx>4 || ny>4)continue;
map[nx][ny]^=1;
map[i][j]^=1;
int p = pack();
if(!vis[p])
{
vis[p]=vis[x]+1;
q.push(p);
}
map[nx][ny]^=1;
map[i][j]^=1;
}
}
return 0;
}