题目连接:点击打开链接
对于这中不是迷宫类型的广搜,最重要的就是两点:
第一:找状态。
第二:找操作。
对于该题:
第一,每位上数字。
第二,有三种操作,加1,减1,交换。
简单的广搜,思路就是最基本的。直接代码。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int L=5;
const int N=11;
bool vis[N][N][N][N];
int PlusOrMinus[10]={1,1,1,1,-1,-1,-1,-1};
struct Status
{
char s[L];
int step;
Status(){}
Status(char s1[],int st)
{
strcpy(s,s1);
step=st;
}
};
void bfs(char begin[],char end[])
{
memset(vis,0,sizeof(vis));
Status status(begin,0);
queue<Status> q;
q.push(status);
vis[begin[0]-'0'][begin[1]-'0'][begin[2]-'0'][begin[3]-'0']=true;
while(!q.empty())
{
Status temp,k;
temp=q.front();
q.pop();
if(strcmp(temp.s,end)==0)
{
printf("%d\n",temp.step);
return ;
}
for(int i=0;i<8;i++)//+-1
{
strcpy(k.s,temp.s);
k.s[i%4]=temp.s[i%4]+PlusOrMinus[i];
if(k.s[i%4]=='9'+1)
k.s[i%4]='1';
if(k.s[i%4]=='1'-1)
k.s[i%4]='9';
if(!vis[k.s[0]-'0'][k.s[1]-'0'][k.s[2]-'0'][k.s[3]-'0'])
{
k.step=temp.step+1;
q.push(k);
vis[k.s[0]-'0'][k.s[1]-'0'][k.s[2]-'0'][k.s[3]-'0']=true;
}
}
for(int i=0;i<3;i++)//swap
{
strcpy(k.s,temp.s);
swap(k.s[i],k.s[i+1]);
if(!vis[k.s[0]-'0'][k.s[1]-'0'][k.s[2]-'0'][k.s[3]-'0'])
{
k.step=temp.step+1;
q.push(k);
vis[k.s[0]-'0'][k.s[1]-'0'][k.s[2]-'0'][k.s[3]-'0']=true;
}
}
}
}
int main()
{
// freopen("1.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
char begin[N],end[N];
scanf("%s%s",begin,end);
bfs(begin,end);
}
return 0;
}