完全不知道怎么回事,求调 :(
查看原帖
完全不知道怎么回事,求调 :(
1227031
ARTI001楼主2024/1/17 21:23
#include<bits/stdc++.h>
using namespace std;
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
int gx[]={1,0,0,0,1,2,2,2,1};
int gy[]={1,0,1,2,2,2,1,0,0};
string goal="123804765";

struct node
{
	int count;
	string now;
	bool operator < (const node &a)const
	{
		return this->count<a.count;
	}
};

string fir;
priority_queue<node> q;

int f(string x)
{
	int a=0;
	for(int i=0;i<9;i++)
	{
		a=a+abs(gx[i]-x[i]/3)+abs(gy[i]-x[i]%3);
	}
	return a;
}

int main()
{
	cin>>fir;
	map<string,int> g;
	g[fir]=0;
	q.push((node){0,fir});
	while(q.empty()==0)
	{
		node tp=q.top();
		q.pop();
		if(goal==tp.now)
		{
			cout<<tp.count<<"?";
			break;
		}
		int n;
		for(int i=0;i<9;i++)
		{
			if(tp.now[i]=='0')
			{
				n=i;
				break;
			}
		}
		int x=n/3,y=n%3;
		for(int i=0;i<4;i++)
		{
			int nx=x+dx[i];
			int ny=y+dy[i];
			if(nx<0||ny<0||nx>=3||ny>=3)continue;
			
			string ne=tp.now;
			swap(ne[n],ne[nx*3+ny]);
			g[ne]=g[tp.now]+1;
			q.push((node){g[ne]+f(ne),ne});
		}
	}
	return 0;
}
2024/1/17 21:23
加载中...