先预处理每一位的变动情况,再直接bfs
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
int vis1[1<<16];
int dis[20][20];
int save,goal;
vector<int>change[20];
int dx[]={0,1,-1,0};
int dy[]={-1,0,0,1};
void init()
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
dis[i][j]=4*(i-1)+j;
}
}
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
for(int k=0;k<4;k++)
{
if(dis[i+dx[k]][j+dy[k]])
{
change[dis[i][j]].push_back(dis[i+dx[k]][j+dy[k]]);
}
}
}
}
}
void bfs()
{
queue<int>q1;
int cur1,cur2,tot1,tot2,pos;
vis1[save]=1;
vis2[goal]=1;
q1.push(save);
q2.push(goal);
while(!q1.empty())
{
cur1=q1.front();
q1.pop();
if(cur1==goal)
{
printf("%d\n",vis1[goal]-1);
break;
}
for(int i=1;i<=16;i++)
{
if(cur1&(1<<(i-1)))
{
for(int j=0;j<change[i].size();j++)
{
if( cur1 & (1 << (change[i][j]-1) ) ) continue;
tot1=cur1+(1 << (change[i][j]-1) ) - (1<<(i-1));
if(!vis1[tot1])
{
vis1[tot1]=vis1[cur1]+1;
q1.push(tot1);
}
}
}
}
}
}
int main()
{
init();
int tmp;
char st[10];
for(int i=1;i<=4;i++)
{
scanf("%s",st+1);
for(int j=1;j<=4;j++)
{
if(st[j]=='1')
{
save+=( 1<<((i-1)*4+j-1) );
}
}
}
for(int i=1;i<=4;i++)
{
scanf("%s",st+1);
for(int j=1;j<=4;j++)
{
if(st[j]=='1')
{
goal+=( 1<<((i-1)*4+j-1) );
}
}
}
bfs();
return 0;
}
本文介绍了一种使用广度优先搜索(BFS)解决迷宫问题的方法,通过预处理迷宫中每个位置可能的变化来优化搜索过程。该算法适用于寻找从起点到终点的最短路径。
1061

被折叠的 条评论
为什么被折叠?



