蒟蒻求问,写了一个不用地图矩阵,直接拍扁成数字搜索,过了
但是我调试的时候发现我没有考虑前导零
即如果出现 0 在 (1,1) 的时候,应该就会直接WA才对,因为这时候数字序列会让 0 变成第一位,即前导零,并消失,如012345678就直接变成12345678,不太理解这个代码怎么水过去了
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
const double pi=3.14;
const int inf=0x3f3f3f3f;
const int NIL=-1;
const int MOD=1e9+7;
const int MAXN=1e6;
bool vis[15];
int gx[9]={2,1,1,1,2,3,3,3,2};
int gy[9]={2,1,2,3,3,3,2,1,1};
int tx[10]={0,1,1,1,2,2,2,3,3,3};
int ty[10]={0,1,2,3,1,2,3,1,2,3};
long long fac[11]={1,10,100,1000,10000,100000,1000000,10000000,100000000};
map<long long,bool> mp;
int getdis(int p,int x,int y){
int res=abs(gx[p]-x)+abs(gy[p]-y);
return res;
}
int get_h(long long p){
int res=0;
for (int i=9;i>=1;i--){
int now=p%10;
res+=getdis(now,tx[i],ty[i]);
p/=10;
}
return res;
}
struct Node{
long long s;int step;
Node(){}
Node(long long ss,int sstep){
s=ss,step=sstep;
}
bool operator <(const Node &x)const{
return x.step+(get_h(x.s))<step+(get_h(s));
}
};
priority_queue<Node> pq;
void BFS(long long s){
pq.push(Node(s,0));
while(!pq.empty()){
long long nows=pq.top().s;int step=pq.top().step;
pq.pop();
if (mp[nows]==1) continue;
if (nows==123804765){
cout<<step<<endl;
exit(0);
}
Sleep(500);
mp[nows]=1;
int i;
for (i=0;i<9;i++){
if ((nows/fac[i])%10==0){
break;
}
}
long long nxts;
if (i%3<2){
nxts=nows+(((nows/fac[i])%10)*fac[i+1])+(((nows/fac[i+1])%10)*fac[i])-(fac[i+1]*((nows/fac[i+1])%10))-(fac[i]*((nows/fac[i])%10));
if (!mp[nxts]) pq.push(Node(nxts,step+1));
}
if (i<6){
nxts=nows+(((nows/fac[i])%10)*fac[i+3])+(((nows/fac[i+3])%10)*fac[i])-(fac[i+3]*((nows/fac[i+3])%10))-(fac[i]*((nows/fac[i])%10));
if (!mp[nxts]) pq.push(Node(nxts,step+1));
}
if (i%3>0){
nxts=nows+(((nows/fac[i])%10)*fac[i-1])+(((nows/fac[i-1])%10)*fac[i])-(fac[i-1]*((nows/fac[i-1])%10))-(fac[i]*((nows/fac[i])%10));
if (!mp[nxts]) pq.push(Node(nxts,step+1));
}
if (i>2){
nxts=nows+(((nows/fac[i])%10)*fac[i-3])+(((nows/fac[i-3])%10)*fac[i])-(fac[i-3]*((nows/fac[i-3])%10))-(fac[i]*((nows/fac[i])%10));
if (!mp[nxts]) pq.push(Node(nxts,step+1));
}
}
}
int read()
{
int ans=0,flag=1;
char ch=getchar();
while( (ch>'9' || ch<'0') && ch!='-' ) ch=getchar();
if(ch=='-') flag=-1,ch=getchar();
while(ch>='0' && ch<='9') ans=ans*10+ch-'0',ch=getchar();
return ans*flag;
}
signed main()
{
//freopen(".in","r",stdin);
long long alls=0;
for (int i=0;i<9;i++){
char x=getchar();
alls+=fac[8-i]*(long long)(x-48);
}
BFS(alls);
}