对着别人AC的代码调的QAQ
使用map就能过,不用map就RE,我不理解TAT
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=1e8+5;
long long int a[100][100];
long long int start,result=123804765;
long long int ans[5000000],vis[5000000];
//这里的定义改为map <int,int> ans,vis;就可以AC
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
queue <long long int> q;
void search(long long int n)
{
q.push(n);
q.push(result);
if(n == result)
{
printf("0");
return;
}
ans[n]=0;
ans[result]=1;
vis[n]=1; vis[result]=2;
long long int x,y,x2,y2;
while(!q.empty())
{
long long int m=q.front();
q.pop();
long long int num=m;
for(int i=2;i>=0;--i)
{
for(int j=2;j>=0;--j)
{
a[i][j]=m%10;
m=m/10;
if(!a[i][j])
{
x=i; y=j;
}
}
}
for(int i=0;i<4;++i)
{
x2=x+dx[i];
y2=y+dy[i];
if(x2<0||x2>2||y2<0||y2>2) continue;
swap(a[x][y],a[x2][y2]);
long long int res=0;
for(int j=0;j<=2;++j)
{
for(int k=0;k<=2;++k)
{
res=res*10+a[j][k];
}
}
if(vis[num]==vis[res])
{
swap(a[x][y],a[x2][y2]);
continue;
}
if(vis[num]+vis[res]==3)
{
cout<<ans[num]+ans[res]<<endl;
return;
}
ans[res]=ans[num]+1;
vis[res]=vis[num];
q.push(res);
swap(a[x][y],a[x2][y2]);
}
}
cout<<ans[result]<<endl;
}
int main()
{
cin>>start;
search(start);
return 0;
}