求问九宫拼图怎么判断有无解
#include<stdio.h>#include<stdlib.h>
#include<time.h>
#define N 3
void show(int *p)//显示九宫格
{
int i,j;
printf("\t \\\\\\|///\n");
printf("\t \\\\ .-.- //\n");
printf("\t ( .@.@ ) \n");
printf("\t\t┏oOOo━━(_) ━━oOOo┓\n");
printf("\t\t┃ ╲ ╱ ┃\n");
printf("\t\t┃ ╔═╦═╦═╗ ┃\n");
for(i=0;i<N;i++)
{
printf("\t\t┃ ║");
for(j=0;j<N;j++)
{
if(*(p+i*3+j)==9)//当数值为9时显示空格
{
printf(" ║");
}else
{
printf(" %d║",*(p+i*3+j));
}
}
printf(" ┃\n");
if(i>=2)
{
printf("\t\t┃ ╚═╩═╩═╝ ┃\n");
printf("\t\t┃ ╱ ╲ ┃\n");
printf("\t\t┗━━━━━━━━━━┛\n");
}
else
{
printf("\t\t┃ ╠═╬═╬═╣ ┃\n");
}
}
}
int num9(int *p)//判断空格所在位置
{
for(int i=0;i<N*N;i++)
{
if(*(p+i)==N*N)
{
return i;
}
}
}
char shuru()//移动输入判断
{
char x;
for(;;)
{
fflush(stdin);
x=getchar();
if(x=='w'||x=='s'||x=='a'||x=='d')
{
break;
}
puts("输入错误!!");
}
return x;
}
int panduan(int *p)//判断是否完成
{
int num=1;
for(int i=0;i<N*N;i++)
{
if(*(p+i)==i+1)
{
num++;
}
}
if(num<9)
{
return 0;
}else
{
return 1;
}
}
int shengcheng(int *p)//判断生成的是否是无解数
{
int j,i,sum,temp;;
for(i=0;i<N*N;i++)//利用插入法排序
{
for(j=i;j<N*N;j++)
{
if(*(p+j)==i+1)
{
sum+=j-i;
temp=*(p+j);
*(p+j)=*(p+i);
*(p+i)=temp;
}
}
}
sum%=2;
return sum;
}
void main()
{
int bu=0;
srand(time(NULL));
int i,j,num[N][N],num2[N][N];
int *p,*q,judge;
p=&num[0][0];
q=&num2[0][0];
for(;;)
{
for(i=0;i<N*N;i++)
{
*(q+i)=*(p+i)=rand()%(N*N)+1;
for(j=0;j<i;)
{
if(*(p+j)==*(p+i))
{
*(q+i)=*(p+i)=rand()%(N*N)+1;
j=0;
}else
{
j++;
}
}
}
judge=shengcheng(q);
if(judge==0)//若为偶数则是有解得 奇数是无解的
{
break;
}
}
printf("输入W S A D 来移动空格 \n");
show(p);
int k;
int x,y;
k=num9(p);
x=k/N;
y=k%N;
int temp;
char choose;
for(;;)
{
fflush(stdin);
choose=shuru();
bu++;
system("cls");
printf("输入W S A D 来移动空格 \n");
switch(choose)//移动 按照输入的字符让空格与想对应的数对换值
{
case 's':
if(x==0)
{
puts("输入错误!");
}
else
{
temp=num[x][y];
num[x][y]=num[x-1][y];
num[x-1][y]=temp;
}
break;
case 'w':
if(x==N-1)
{
puts("输入错误!");
}else
{
temp=num[x][y];
num[x][y]=num[x+1][y];
num[x+1][y]=temp;
}
break;
case 'd':
if(y==0)
{
puts("输入错误!");
}else
{
temp=num[x][y];
num[x][y]=num[x][y-1];
num[x][y-1]=temp;
}
break;
case 'a':
if(y==N-1)
{
puts("输入错误!");
}else
{
temp=num[x][y];
num[x][y]=num[x][y+1];
num[x][y+1]=temp;
}
break;
}
show(p);
k=num9(p);
x=k/N;
y=k%N;
if(panduan(p))
{
printf("你一共用了%d步\n你通过了\n",bu);
break;
}
}
}
偶的代码 求指导