7个回答
展开全部
首先贴效果:
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、方便测试,我直接把数组赋值了。你要自己输入的话,注释那段代码用起来就可以了。
楼主好运!
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、方便测试,我直接把数组赋值了。你要自己输入的话,注释那段代码用起来就可以了。
楼主好运!
展开全部
比较次的一个代码……不一定能解出所有可解的情形。
/*
*先用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;
}
/*
*先用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;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
只是输入和输出:
#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();
}
#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();
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
晚上要熄灯了等我明天给你编个试试,就是用循环来不断判断满足九宫图不。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
直接用深搜或广搜,就可以解决了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询