社区讨论

求助啊 大佬 15分

P1379八数码难题参与者 6已保存回复 11

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
11 条
当前快照
1 份
快照标识符
@mi7pn343
此快照首次捕获于
2025/11/21 01:33
4 个月前
此快照最后确认于
2025/11/21 01:52
4 个月前
查看原帖

#include<bits/stdc++.h>

using namespace std;

int a[1000001][3][3],

b[3][3]={1,2,3,8,0,4,7,6,5};

int c[4][2]={1,0,-1,0,0,1,0,-1},d[1000001]={-1},s;

char m[25];

void pr(int k)

{
CPP
if(k<0) return ;
pr(d[k]);
int i,j;
s=s+1;//递归
}

int jc(int k)

{
CPP
int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
	if(a[k][i][j]!=b[i][j]) return 0;
}

return 1;
}

int nrep(int k)

{
CPP
int z,i,j,n;
for(z=0;z<k;z++)
{  n=1;
	for(i=0;i<3;i++)
	for(j=0;j<3;j++)
	{
		if(a[z][i][j]!=a[k][i][j]) n=0;
	
	}
	if(n==1) return 0;
}
return 1;//与以前的对照是否重复
}

void bfs()

{
CPP
int head,tail,l,i,j,x,y,x1,y1;
head=0;
tail=1;
do
{
	for(i=0;i<3;i++)
for(j=0;j<3;j++)
{    
	if(a[head][i][j]==0)//找0
	{
		x=i;
		y=j;
	}
}
	for(l=0;l<4;l++)//上下左右搜索
	{
		x1=x+c[l][0];
		y1=y+c[l][1];
		if(x1>=0&&x1<3&&y1>=0&&y1<3)
		{
			for(i=0;i<3;i++)
			for(j=0;j<3;j++)
				a[tail][i][j]=a[head][i][j];
				a[tail][x1][y1]=0;
				a[tail][x][y]=a[head][x1][y1];
				d[tail]=head;//转完后的数字
			
		 if(nrep(tail))//检查
		{
			if(jc(tail))//与目标对照
			{
				s=0;pr(tail);return;
			}//打印
			tail++;
		}
	
		}
		
	}
	head++;
} while(head<tail);
if(head>tail)
cout<<" no"<<endl;

 
}

int main()

{
CPP
cin>>m;
int w,i;
 w=strlen(m);
for(i=0;i<w;i++)
{
	a[0][i/3][i%3]=m[i]-'0';//将char数组转为a数组
}
bfs();//搜索
cout<<s-1<<endl;
}

回复

11 条回复,欢迎继续交流。

正在加载回复...