社区讨论
RE求助
P1379八数码难题参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lzhyl0w1
- 此快照首次捕获于
- 2024/08/06 13:07 2 年前
- 此快照最后确认于
- 2024/08/06 14:16 2 年前
敝人新手,在做本题时,自己在dev中测试没问题,而提交评测后有4个测试点AC了,但其他测试点均出现了RE,显示的错误信息为Runtime Error.Received signal 11: Segmentation fault with invalid memory reference.想请教一下各位大佬:
1、我的程序在哪里出了问题(附在下方)
2、这种错误信息一般是由什么造成的
CPP1、我的程序在哪里出了问题(附在下方)
2、这种错误信息一般是由什么造成的
#include<bits/stdc++.h>
using namespace std;
struct node
{
short m[4][4]; //该情况下的数码盘,前一个是行,后一个是列
int pre; //这一步的上一步对应的序号(即结构体数组a的序号)
int sx,sy; //该情况下0所在的行与列。
};
node a[10001]; //数组每一项储存一种情况。
bool dd[9][9][9][9][9][9][9][9];//用来查重的,九维数组空间超了,就用的八维。
char p[9];int x,y,head,tail;bool f;int c;
int u[5]={0,0,1,0,-1},w[5]={0,1,0,-1,0};
//这是用于讨论某一个格子的上下左右时用的,后面有。
void out(int n) //输出
{
int s=0,o=n;
while(a[o].pre!=0)
{
s++;
o=a[o].pre;
}
cout<<s;
}
int main()
{
memset(dd,false,sizeof(dd));c=0;
scanf("%s",p);int t=0;f=false;
for(int i=1;i<=3;i++) //将输入转化为初始数码盘
{
for(int j=1;j<=3;j++)
{
a[1].m[i][j]=p[t]-'0';
t++;c=c*10+a[1].m[i][j];
if(a[1].m[i][j]==0)
{
a[1].sx=i;a[1].sy=j;
}
}
}
dd[a[1].m[1][1]][a[1].m[1][2]][a[1].m[1][3]][a[1].m[2][1]][a[1].m[2][2]][a[1].m[2][3]][a[1].m[3][1]][a[1].m[3][2]]=true;
a[1].pre=0;
head=0;tail=1;
if(c==123804765) //防止输入的情况就是目标情况
{
cout<<"0";
head=2; //使下面的循环无法发生
}
while(head<tail) //开始广搜
{
head++;
for(int r=1;r<=4;r++)
{
x=a[head].sx+u[r];y=a[head].sy+w[r]; //这两行即产出0的上下左右四个坐标
if((x>0)&&(x<=3)&&(y>0)&&(y<=3))
{
tail++;c=0;
a[tail].pre=head;
for(int i=1;i<=3;i++)
{
for(int j=1;j<=3;j++)
{
if((i==x)&&(j==y))
{
a[tail].m[i][j]=0;
a[tail].sx=x;a[tail].sy=y;
}
else
{
if((i==a[head].sx)&&(j==a[head].sy))
a[tail].m[i][j]=a[head].m[x][y];
else
a[tail].m[i][j]=a[head].m[i][j];
}
c=c*10+a[tail].m[i][j];
}
}
if(c==123804765) //判断是否终止
{
out(tail);
f=true;break;
}
if(dd[a[tail].m[1][1]][a[tail].m[1][2]][a[tail].m[1][3]][a[tail].m[2][1]][a[tail].m[2][2]][a[tail].m[2][3]][a[tail].m[3][1]][a[tail].m[3][2]]) //判断是否重复
{
tail--; //若重复,本次讨论无效,tail指针退回
continue;
}
dd[a[tail].m[1][1]][a[tail].m[1][2]][a[tail].m[1][3]][a[tail].m[2][1]][a[tail].m[2][2]][a[tail].m[2][3]][a[tail].m[3][1]][a[tail].m[3][2]]=true;
}
}
if(f) //若终止,就不用再循环了。
break;
}
return 0;
}
谢谢各位大佬!!!
回复
共 4 条回复,欢迎继续交流。
正在加载回复...