八数码难题
  • 板块灌水区
  • 楼主Reserved_
  • 当前回复9
  • 已保存回复9
  • 发布时间2024/9/12 20:08
  • 上次更新2024/9/12 23:02:54
查看原帖
八数码难题
1395815
Reserved_楼主2024/9/12 20:08
#include<bits/stdc++.h>
using namespace std;
int s[5][5],e[5][5],c[5][5],d[5][5];
int sum,spa1,spa2;
int h,t,q[400000][2],n;
int ha[1000007];
const int xi=1000007;
const int dx[5]={0,0,1,-1};
int dy[5]={1,-1,0,0};
bool haxi(int s)
{
	int wei=s%xi;
	if(!ha[wei])
	{
		ha[wei]=s;
		return 1;
	}
	while(ha[wei]!=0&&ha[wei]!=s)
	{
		wei++;
	}
	if(ha[wei]==s)
	{
		return 0;
	}
	else
	{
		ha[wei]=s;
		return 1;
	}
}
int dg1(int a[5][5])
{
	int ans=0;
	for(int i=1;i<4;i++)
	{
		for(int j=1;j<4;j++) 
		{
			ans=ans*10+a[i][j];
		}
	}
	return ans;
}
void dg2(int k)
{
	for(int i=3;i>0;i--)
	{
		for(int j=3;j>0;j--)
		{
			c[i][j]=k%10;
			if(k%10==0)
			{
				spa1=i;
				spa2=j;
			}
			k/=10;
		}
	}
}
int main()
{
	cin>>n;
	sum=123804765;
	if(n==sum)
	{
		cout<<0;
		return 0;
	}
	h=0,t=1;
	q[t][1]=n;
	q[t][2]=0;
	ha[q[t][1]%xi]=q[t][1];
	while(h<t)
	{
		h++;
		int x=q[h][1];
		dg2(x);
		for(int i=0;i<4;i++)
		{
			int xx=spa1+dx[i],yy=spa2+dy[i];
			for(int j=1;j<4;j++)
			{
				for(int k=1;k<4;k++)
				{
					d[j][k]=c[j][k];
				}
			}
			if(xx>0&&xx<4&&yy>0&&yy<4)
			{
				swap(d[xx][yy],d[spa1][spa2]);
				int sum1=dg1(d);
				if(haxi(sum1))
				{
					t++;
					q[t][1]=sum1;
					q[t][2]=q[h][2]+1;
					if(sum1==sum)
					{
						cout<<q[t][2];
						return 0;
					}
				}
			}
		}
	}
	cout<<-1;
	return 0;
}
2024/9/12 20:08
加载中...