社区讨论

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、这种错误信息一般是由什么造成的
CPP
#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 条回复,欢迎继续交流。

正在加载回复...