九宫格拼图c语言程序,求问九宫拼图怎么判断有无解

已结贴√

问题点数:20 回复次数:2

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

求问九宫拼图怎么判断有无解

#include

#include

#include

#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

{

printf("\t\t┃   ║");

for(j=0;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

{

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

{

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

{

for(j=i;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

{

*(q+i)=*(p+i)=rand()%(N*N)+1;

for(j=0;j

{

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;

}

}

}

偶的代码 求指导

b3219118c4f0e53adab74ec31a2cf944.gif

b3219118c4f0e53adab74ec31a2cf944.gif

搜索更多相关主题的帖子:

拼图 include 九宫格

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值