社区讨论
求助啊 大佬 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)
{
CPPif(k<0) return ;
pr(d[k]);
int i,j;
s=s+1;//递归
}
int jc(int k)
{
CPPint 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)
{
CPPint 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()
{
CPPint 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()
{
CPPcin>>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 条回复,欢迎继续交流。
正在加载回复...