貌似可以HACK
查看原帖
貌似可以HACK
112631
Lovable_Wind楼主2022/10/11 20:46

蒟蒻求问,写了一个不用地图矩阵,直接拍扁成数字搜索,过了

但是我调试的时候发现我没有考虑前导零

即如果出现 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);
}

2022/10/11 20:46
加载中...