1~9数字九宫格的解法是什么?

1~9数字九宫格的解法是什么?,第1张

1~9数字九宫格的解法是如下:

*** 作设备:戴尔笔记本电脑

*** 作系统:win10

*** 作程序:excel文档

1、要想将1-9加入九宫格,中心数字就必须为5。

2、方法1:第一行数字为4、3、8;第二行数字为9、5、1;第三行数字为2、7、6。

3、方法2:第一行数字为8、1、6;第二行数字为3、5、7;第三行数字为4、9、2。

4、方法3:第一行数字为6、1、8;第二行数字为7、5、3;第三行数字为2、9、4。

5、方法4:第一行数字为2、9、4;第二行数字为7、5、3;第三行数字为6、1、8。

前两天刚写完,还没优化,已运行通过了.

晕,一维的好麻烦,这个也是碰巧前两天刚写好的,你看着自己修改下

#include <stdio.h>

typedef struct

{

int line

int row

int num

}Node

int main()

{

/*

int a[9][9]={

{4,0,3,6,0,0,0,0,0},

{0,0,0,0,0,1,0,2,4},

{0,1,0,0,4,0,5,0,0},

{0,0,0,9,0,4,0,6,0},

{3,0,2,0,0,0,4,0,9},

{0,7,4,1,0,3,0,0,0},

{0,0,1,0,9,0,0,4,0},

{2,4,0,3,0,0,0,0,0},

{0,0,0,4,0,8,2,0,7}}

*/

int a[9][9]={

{0,0,0,8,0,0,0,6,0},

{8,7,0,0,0,0,0,0,0},

{2,9,0,0,4,1,0,0,5},

{0,0,5,7,0,0,0,0,9},

{0,2,0,0,0,0,0,1,0},

{9,0,0,0,0,4,3,0,0},

{7,0,0,6,1,0,0,9,8},

{0,0,0,0,0,0,0,5,2},

{0,6,0,0,0,9,0,0,0}}

/*

int a[9][9]={

{0,2,0,0,6,0,0,0,0},

{0,9,0,4,0,5,1,3,0},

{0,0,8,7,0,0,0,0,5},

{6,0,0,3,0,0,4,0,0},

{0,0,0,9,0,6,0,0,0},

{0,0,7,0,0,1,0,0,3},

{4,0,0,0,0,7,3,0,0},

{0,8,5,2,0,4,0,7,0},

{0,0,0,0,9,0,0,1,0}}

*/

/*

int a[9][9]={

{0,0,3,0,2,0,0,0,6},

{0,0,2,0,9,0,0,0,4},

{7,0,0,8,0,0,2,0,3},

{0,8,0,0,7,0,5,0,0},

{0,7,0,1,0,6,0,3,0},

{0,0,0,2,0,0,0,9,0},

{4,0,6,0,0,8,0,0,5},

{6,0,0,0,4,0,3,0,0},

{9,0,0,0,1,0,7,0,0}}

*/

int i,j,n,en,flag,y,k=0,x,qu,p,q

Node b[70]

for(i=0i<9i++)

{

for(j=0j<9j++)

{

if(!a[i][j])

{

b[k].line=i

b[k].row=j

b[k].num=0

k+=1

}

}

}

en=k

/*从b[0]开始试,若b[k].num>9,则k-1,否则k+1*/

for(k=0k<en)

{

++b[k].num

i=b[k].line

j=b[k].row

a[i][j]=b[k].num

n=0

while(n<9&&b[k].num<=9)

{

if(n==i)

{

for(y=0y<9y++)

{

if(y==j)

continue

if(a[n][y]==a[i][j])

flag=1

}

}

else if(n==j)

{

for(y=0y<9y++)

{

if(y==i)

continue

if(a[y][n]==a[i][j])

flag=1

}

}

/*判断同一块中有没有相同值*/

qu=3*(i/3)+j/3

switch(qu)

{

case 0:x=0

y=0

break

case 1:x=0

y=3

break

case 2:x=0

y=6

break

case 3:x=3

y=0

break

case 4:x=3

y=3

break

case 5:x=3

y=6

break

case 6:x=6

y=0

break

case 7:x=6

y=3

break

default :x=6

y=6

break

}

p=x

q=y

for(x<p+3x++)

{

for(y<q+3y++)

{

if(x==i&&y==j)

continue

if(a[x][y]==a[i][j])

{

flag=1

break

}

}

if(flag==1)

break

}

if(flag==1)

{

a[i][j]=++b[k].num

flag=0

n=0

continue

}

n++

}

if(b[k].num>9)

{

a[i][j]=b[k].num=0

k--

if(k<0)

{

printf("error!\r\n")

return -1

}

}

else

k++

}

for(i=0i<9i++)

{

for(j=0j<9j++)

{

printf("%d",a[i][j])

}

printf("\r\n")

}

return 1

}

分为三种情况:N为奇数、N为4的倍数、N为其它偶数(4n+2的形式)

1、 N为奇数时

⑴ 将1放在第一行中间一列。

⑵ 从2开始直到n×n止各数依次按下列规则存放:按 45°方向行走,如向右下,每一个数存放的行比前一个数的行数减1,列数加1。

⑶ 如果行列范围超出矩阵范围,则回绕。例如1在第1行,则2应放在最上一行,列数同样加1。

⑷ 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的上面。

2、 N为4的倍数时

采用对称元素交换法。首先把数1到n×n按从上至下,从左到右顺序填入矩阵,然后将方阵的所有4×4子方阵中的两对角线上位置的数关于方阵中心作对,称交换,即a(i,j)与a(n+1-i,n+1-j)交换,所有其它位置上的数不变。(或者将对角线不变,其它位置对称交换也可)

3、 N为其它偶数时

当n为非4倍数的偶数(即4n+2形)时:首先把大方阵分解为4个奇数(2m+1阶)子方阵。按上述奇数阶幻方给分解的4个子方阵对应赋值,由小到大依次为上左子阵(i),下右子(i+v),上右子阵(i+2v),下左子阵(i+3v),即4个子方阵对应元素相差v,其中v=n*n/4。

四个子矩阵由小到大排列方式为 ① ③ ④ ②,然后作相应的元素交换:a(i,j)与a(i+u,j)在同一列做对应交换(j<t或j>n-t+2),a(t-1,0)与a(t+u-1,0);a(t-1,t-1)与a(t+u-1,t-1)两对元素交换。其中u=n/2,t=(n+2)/4 上述交换使行列及对角线上元素之和相等,如下图:

扩展资料

性质:

将n阶幻方看作一个矩阵,记为A,其中的第i行j列的数字记为a(i,j)。在A内两对角线上填写1、2、3、……、n,各行再填写1、2、3、……、n,使各行各列数字之和为n*(n+1)/2。第1行从n到1填写,从第2行到第n/2行按从1到进行填写(第2行第1列填n,第2行第n列填1),从第n/2+1到第n行按n到1进行填写,对角线的方格内数字不变。

n阶幻方是由前n^2(n的2次方)个自然数组成的一个n阶方阵,其各行、各列及两条对角线所含的n个数的和相等。

将从一到若干个数的自然数排成纵横各为若干个数的正方形,使在同一行、同一列和同一对角线上的几个数的和都相等。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7783484.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存