没用队列,用数组,请大神告诉错哪了。
报错
Program received signal SIGSEGV, Segmentation fault
#include<iostream>
#include<cstdlib>
#include<math.h>
#include<stack>
#define right 3
#define left 2
#define down 1
#define up 0
#define MAX 363000
using namespace std;
typedef struct node{
int a[9];
int dir;
long long p;
node *fu;
};
struct node sh[MAX],end;
long count=1;
long long res_end=0;
void init(){
printf("输入初始节点矩阵\n");
for(int i=0;i<9;i++){
scanf("%d",&sh[0].a[i]);
}
printf("输入终止节点矩阵\n");
for(int i=0;i<9;i++){
scanf("%d",&end.a[i]);
res_end+=end.a[i]*pow(10,8-i);
}
}
int loction(int num){
int i;
for(i=0;i<9;i++){
if(sh[num].a[i]==0)
return i;
}
}
bool isequ(long num){
long long sum=0;
for(int i=0;i<9;i++){
sum+=sh[num].a[i]*pow(10,8-i);
}
//return sum;
if(sum==res_end) return true;
else return false;
}
bool haveresult(int num){
int sum1=0,sum2=0;
for(int i=8;i>=0;i--){
for(int j=0;j<i;j++){
if(sh[num].a[j]>sh[num].a[i]&&sh[num].a[i]!=0){
sum1++;
}
}
}
// printf("%d ",sum1);
for(int i=8;i>=0;i--){
for(int j=0;j<i;j++){
if(end.a[j]>end.a[i]&&end.a[i]!=0){
sum2++;
}
}
}
// printf("%d ",sum2);
//printf("%d",sum1%sum2);
if(sum1%2==sum2%2) return true;
else return false;
}
void exchange(long long num){
int temp;
int loc;
loc=loction(num);
//up
if(loc<6&&sh[num].dir!=down){
**sh[count]=sh[num]**;//调试在这一行报错
temp=sh[count].a[loc];
sh[count].a[loc]=sh[count].a[loc+3];
sh[count].a[loc+3]=temp;
sh[count].dir=up;
sh[count].p=count;
sh[count].fu=&sh[num];
//sh[num].u=sh[count];
count++;
}
//down
if(loc>2&&sh[num].dir!=up){
sh[count]=sh[num];
temp=sh[count].a[loc];
sh[count].a[loc]=sh[count].a[loc-3];
sh[count].a[loc-3]=temp;
sh[count].dir=down;
sh[count].p=count;
sh[count].fu=&sh[num];
//sh[num].d=sh[count];
count++;
}
//left
if((loc+1)%3!=0&&sh[num].dir!=right){
sh[count]=sh[num];
temp=sh[count].a[loc];
sh[count].a[loc]=sh[count].a[loc+1];
sh[count].a[loc+1]=temp;
sh[count].dir=left;
sh[count].p=count;
sh[count].fu=&sh[num];
//sh[num].l=sh[count];
count++;
}
//right
if(loc%3!=0&&sh[num].dir!=left){
sh[count]=sh[num];
temp=sh[count].a[loc];
sh[count].a[loc]=sh[count].a[loc-1];
sh[count].a[loc-1]=temp;
sh[count].dir=right;
sh[count].p=count;
sh[count].fu=&sh[num];
//sh[num].r=sh[count];
count++;
}
}
int search(){
long i=0;
while(1){
if(isequ(i)){
printf("在第%d次找到\n",i);
return i;
}
exchange(i);
i++;
}
}
int main(){
init();
sh[0].dir=-1;
sh[0].p=0;
//printf("%d\n",res_end);
//printf("%d\n",isnum(0));
if(!haveresult(0)){
printf("无解\n");
}
else{
printf("有解\n");
int i,k=0;
stack<int> st;
i=search();
while(sh[i].fu!=NULL){
st.push(sh[i].dir);
i=sh[i].fu->p;
k++;
}
while(!st.empty()){
printf("%d ",st.top());
st.pop();
}
}
}