用C语言编程问题

输入9个数字,输出这9个数字组成的九宫图。无解提示无解,多个解都输出。... 输入9个数字,输出这9个数字组成的九宫图。
无解提示无解,多个解都输出。
展开
 我来答
Negamax
推荐于2016-11-27 · TA获得超过2722个赞
知道小有建树答主
回答量:656
采纳率:100%
帮助的人:287万
展开全部
首先贴效果:
initial array is :
1 2 3
4 5 6
7 8 9

2 7 6
9 5 1
4 3 8

2 9 4
7 5 3
6 1 8

4 3 8
9 5 1
2 7 6

4 9 2
3 5 7
8 1 6

6 1 8
7 5 3
2 9 4

6 7 2
1 5 9
8 3 4

8 3 4
1 5 9
6 7 2

8 1 6
3 5 7
4 9 2

total solving :8

不能构成的情况:
initial array is :
0 9 4
7 5 3
6 1 8

The number you input can not be jiuGongGe!

再贴源代码:
#include <stdio.h>
#include "conio.h"

long n = 0;

void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}

int isJiuGongGe(int array[])
{
int sum=(array[0]+array[1]+array[2]);
if(sum==(array[3]+array[4]+array[5])&&sum==(array[6]+array[7]+array[8])&&
sum==(array[0]+array[4]+array[8])&&sum==(array[2]+array[4]+array[6])&&
sum==(array[0]+array[3]+array[6])&&
sum==(array[1]+array[4]+array[7])&&
sum==(array[2]+array[5]+array[8]))
return 1;
else
return 0;
}

void printfArray(int array[])
{
int i=0;
for(i=0;i<9;i++)
{
printf("%2d",array[i]);
if((i+1)%3==0)
{
printf("\n");
}
}
printf("\n");
}

void findAllJiugongge(int list[], int k, int m)
{
int i;
if(k > m)
{
if(isJiuGongGe(list))
{
printfArray(list);
n++;
}

}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
findAllJiugongge(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}

int main()
{
int list[] = {0, 9, 4, 7, 5,3,6,1,8};
int i=0;
/*for(i=0;i<9;i++)
{
scanf("%d",&array[i]);
}*/
printf("initial array is :\n");
printfArray(list);
findAllJiugongge(list, 0, 8);
if(n>0)
{
printf("total solving :%ld\n", n);
}
else
{
printf(" The number you input can not be jiuGongGe!\n");
}

getch();
}

再说说思路:
1、 9个数放到一个9个元素的数组中。
2、对9个数进行全排列,没排列一种可能都判断下是否满足九宫格情况。满足就输出。

3、提高篇:这个方式是最直观的一种方法,最好懂的一种方法。
当然也可以用深度搜索,宽度搜索或者是A*算法搜索出所有的解。但是没有多大的意义,在游戏开发中到可以使用。尤其是8数码问题、拼图、华容道等难题中。

4、方便测试,我直接把数组赋值了。你要自己输入的话,注释那段代码用起来就可以了。
楼主好运!
SnowOnion
2012-03-26 · TA获得超过2198个赞
知道小有建树答主
回答量:150
采纳率:0%
帮助的人:61.2万
展开全部
比较次的一个代码……不一定能解出所有可解的情形。

/*
*先用02062311-snowonion条件进行判断。
*所谓02062311-snowonion条件就是指:
*"能写成九宫格的充分条件是,九个数可以表示成如下形式:
*A-d,A,A+d,B-d,B,B+d,C-d,C,C+d"。
*通过判断的按某一种构造法构造成九宫格,通不过判断则提示错误。
*/

#include<stdio.h>

int is_arithmetical(int*a,int n)
{
int d,i;
if(n>=3)
{
d=a[1]-a[0];
for(i=1; i<n-1; i++)
{
if(a[2]-a[1]!=d)
{
return 0;
}
}
return 1;
}
else return 1;
}
int is_0s(int* a)
{
int b[3]= {a[1],a[4],a[7]};
if(is_arithmetical(a,3)&&is_arithmetical(a+3,3)&&is_arithmetical(a+6,3)&&is_arithmetical(b,3))
{
return 1;
}
else return 0;
}
void sort(int* a)
{
int i,j,t;
for(i=1; i<9; i++)
{
for(j=0; j<9-i; j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
void printnine(int* a) //这里用的是一种构造方法……当然把他对称或者旋转也是对的……
{
printf("-------------------------\n");
printf("%d\t%d\t%d\n%d\t%d\t%d\n%d\t%d\t%d\n",a[5],a[0],a[7],a[6],a[4],a[2],a[1],a[8],a[3]);
printf("-------------------------\n");
}
int main()
{
int a[9];
int i;
while(1)
{
printf("请输入九个整数,以空格或回车隔开:\n");
for(i=0; i<9; i++)
{
scanf("%d",&a[i]);
}
sort(a);
if(is_0s(a))
{
printnine(a);
}
else
{
printf("您输入的九个数没有通过02062311-snowonion条件的检测,可能写不成九宫格╮(╯▽╰)╭\n");
}
}
return 0;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
foong_79
2012-03-26 · TA获得超过731个赞
知道小有建树答主
回答量:424
采纳率:100%
帮助的人:482万
展开全部
只是输入和输出:
#include <stdio.h>
#include <conio.h>

void main(void)
{
int n[9],i,x,y;

for(i=0;i<9;i++)
{
printf("input[%i]:",i+1);
scanf("%d",&n[i]);
getchar();
}

for (y=0;y<3;y++)
{
for (x=0;x<3;x++)
{
printf("%2d ",n[y*3+x]);
}
printf("\n");
}
getch();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lymenglei
2012-03-25
知道答主
回答量:49
采纳率:0%
帮助的人:31.2万
展开全部
晚上要熄灯了等我明天给你编个试试,就是用循环来不断判断满足九宫图不。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
独孤九剑碧血剑
2012-03-26
知道答主
回答量:21
采纳率:0%
帮助的人:14万
展开全部
直接用深搜或广搜,就可以解决了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式