1组64个数字8×8排列,共8组64列,要求每一列都不能重复出现2个数字

1到64,64个数字,8×8排列,这样为一组,共8组;
要求:64个竖排中不能重复出现两个数字,比如第一列有1和9,那么后面的任何一列都不能同时出现1和9,否则就是无效的,请编程,C最好,如果是用在Excel上的也行。
如果直接写出来也可以,图片上传

首先确定方法的可用性:
任意排列一组数作为第一组,设第一列到第八列分别为a1-a8
那么a1-a8每一列都不在自己位置的全排列个数为:8!-(8*7!-8)
8!为总的排列个数8*7!-8为全排列时以第一组为基准有任意一列在原来位置的个数。
这是从计算中得出的结果,但是事实却比这个简单的多,看下面的结果:
第一组A1 A2 A3 A4 A5 A6 A7 A8
第二组A2 A3 A4 A5 A6 A7 A8 A1
第三组A3 A4 A5 A6 A7 A8 A1 A2
...
...
...
就是这样,第一组取四楼的第一组数就可以如果不喜欢可以随意改追问

没这么简单,也许可以算出一组,但这样后面会重复的

追答

你没看懂

追问

你自己写三组就知道了

追答

1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64

2 3 4 5 6 7 8 1
10 11 12 13 14 15 16 9
18 19 20 21 22 23 24 17
26 27 28 29 30 31 32 25
34 35 36 37 38 39 40 33
42 43 44 45 46 47 48 41
50 51 52 53 54 55 56 49
58 59 60 61 62 63 64 57

3 4 5 6 7 8 1 2
11 12 13 14 15 16 9 10
19 20 21 22 23 24 17 18
27 28 29 30 31 32 25 26
35 36 37 38 39 40 33 34
43 44 45 46 47 48 41 42
51 52 53 54 55 56 49 50
59 60 61 62 63 64 57 58

追问

我说过了,以1和9为例,第一列出现了,以后再出现,就是重复,你看179498647回答的就避免了这一情况,但是他别的地方还是出错了,象你说的这么简单的话,我完全没有必要花大价钱来悬赏

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-22
这个说不明白 给你个思路自己研究吧
把问题反过来证明 设所有相邻方格两个数的差都大于5 这样一个格子就最少有两个相邻的 并且差互相大于5 所以一定有一个比旁边的大10以上 就算是每个都有两个相邻的 这样排列下去就是隔一个 差是10 再隔一个 还是10 也就是斜向的差小 横竖的大 那么一个格子有4个相邻的数呢 差距就出来了
你可能有点不明白 说实话我也不太明白 我只能说到这里 抱歉
第2个回答  2013-08-23
C语言程序:
可能有点麻烦 这只是我的想法。
#include<stdio.h>
void main()
{
int a[8][8],i,j,k;
printf("第一个:\n");
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
a[i][j]=j+1+8*i;
}

for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf("%3d",a[i][j]);
printf("\n");
}
printf("第二个:\n");

for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
a[i][j]=j+1+8*i;
}

for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf("%3d",a[j][i]);
printf("\n");
}
printf("第三个:\n");
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{a[i][j]=j+1+9*i;
if(a[i][j]>64)
{a[i][j]=a[i][j]-9+1;
}
}
}

for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf("%3d",a[i][j]);
printf("\n");
}
printf("第四个:\n");
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
a[i][j]=j+1+9*i;
k=7-j;
if(i>0)
{a[i][j]=a[i][j]+1;}
if(i>=k)
{a[i][j]=a[i][j]-9+1;}
if(i==0&&j==7)
a[i][j]=8;
if(i==7)
{a[i][j]=a[i][j]+1; }
if(a[i][j]>64)
{a[i][j]=a[i][j]-9+1;
}
}
}

for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf("%3d",a[i][j]);
printf("\n");
}
printf("第五个:\n");
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
a[i][j]=j+1+9*i;
k=6-j;
if(i>0)
{a[i][j]=a[i][j]+2;}
if(i>=k)
{a[i][j]=a[i][j]-9+1;}
if(i==7)
{a[i][j]=a[i][j]+1; }
if(a[i][j]>64)
{a[i][j]=a[i][j]-9+1;
}
}
}
a[0][6]=7;
a[0][7]=8;
for(j=0;j<8;j++)
a[6][j]=a[6][j]+1;
a[6][7]=a[6][7]-8;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf("%3d",a[i][j]);
printf("\n");
}
printf("第六个:\n");
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
a[i][j]=j+1+9*i;
k=5-j;
if(i>0)
{a[i][j]=a[i][j]+3;}
if(i>=k)
{a[i][j]=a[i][j]-9+1;}
if(i==7)
{a[i][j]=a[i][j]+1; }
if(a[i][j]>64)
{a[i][j]=a[i][j]-9+1;
}
}
}
for(j=5;j<8;j++)
a[0][j]=j+1;
for(i=5;i<7;i++)
{
for(j=0;j<8;j++)
a[i][j]=a[i][j]+1;}
for(j=7;j<8;j++)
a[5][j]=a[5][j]-8;
for(j=6;j<8;j++)
a[6][j]=a[6][j]-8;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf("%3d",a[i][j]);
printf("\n");
}
printf("第七个:\n");
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
a[i][j]=j+1+9*i;
k=4-j;
if(i>0)
{a[i][j]=a[i][j]+4;}
if(i>=k)
{a[i][j]=a[i][j]-9+1;}
if(i==7)
{a[i][j]=a[i][j]+1; }
if(a[i][j]>64)
{a[i][j]=a[i][j]-9+1;
}
}
}
for(j=4;j<8;j++)
a[0][j]=j+1;
for(i=4;i<7;i++)
{
for(j=0;j<8;j++)
a[i][j]=a[i][j]+1;}
for(j=7;j<8;j++)
a[4][j]=a[4][j]-8;
for(j=6;j<8;j++)
a[5][j]=a[5][j]-8;
for(j=5;j<8;j++)
a[6][j]=a[6][j]-8;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf("%3d",a[i][j]);
printf("\n");
}
printf("第八个:\n");
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
a[i][j]=j+1+9*i;
k=3-j;
if(i>0)
{a[i][j]=a[i][j]+5;}
if(i>=k)
{a[i][j]=a[i][j]-9+1;}
if(i==7)
{a[i][j]=a[i][j]+1; }
if(a[i][j]>64)
{a[i][j]=a[i][j]-9+1;
}
}
}
for(j=3;j<8;j++)
a[0][j]=j+1;
for(i=3;i<7;i++)
{
for(j=0;j<8;j++)
a[i][j]=a[i][j]+1;}
for(j=7;j<8;j++)
a[3][j]=a[3][j]-8;
for(j=6;j<8;j++)
a[4][j]=a[4][j]-8;
for(j=5;j<8;j++)
a[5][j]=a[5][j]-8;
for(j=4;j<8;j++)
a[6][j]=a[6][j]-8;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf("%3d",a[i][j]);
printf("\n");
}

}追问

这个还没有试过,不知道你自己运行能得出结果么,还是Error?

追答

我自己在VC上 运行了 能出现结果

第3个回答  2013-08-17
如果您看到答案在24分钟内采纳,您会好运24天,心动不如行动,采纳吧!
第4个回答  2013-08-30
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64

1 2 3 4 5 6 7 8
10 11 12 13 14 15 16 9
19 20 21 22 23 24 17 18
28 29 30 31 32 25 26 27
37 38 39 40 33 34 35 36
46 47 48 41 42 43 44 45
55 56 49 50 51 52 53 54
64 57 58 59 60 61 62 63

1 2 3 4 5 6 7 8
11 12 13 14 15 16 9 10
21 22 23 24 17 18 19 20
31 32 25 26 27 28 29 30
33 34 35 36 37 38 39 40
43 44 45 46 47 48 41 42
53 54 55 56 49 50 51 52
63 64 57 58 59 60 61 62

1 2 3 4 5 6 7 8
12 13 14 15 16 9 10 11
23 24 17 18 19 20 21 22
26 27 28 29 30 31 32 25
37 38 39 40 33 34 35 36
48 41 42 43 44 45 46 47
51 52 53 54 55 56 49 50
62 63 64 57 58 59 60 61

1 2 3 4 5 6 7 8
13 14 15 16 9 10 11 12
17 18 19 20 21 22 23 24
29 30 31 32 25 26 27 28
33 34 35 36 37 38 39 40
45 46 47 48 41 42 43 44
49 50 51 52 53 54 55 56
61 62 63 64 57 58 59 60

1 2 3 4 5 6 7 8
14 15 16 9 10 11 12 13
19 20 21 22 23 24 17 18
32 25 26 27 28 29 30 31
37 38 39 40 33 34 35 36
42 43 44 45 46 47 48 41
55 56 49 50 51 52 53 54
60 61 62 63 64 57 58 59

1 2 3 4 5 6 7 8
15 16 9 10 11 12 13 14
21 22 23 24 17 18 19 20
27 28 29 30 31 32 25 26
33 34 35 36 37 38 39 40
47 48 41 42 43 44 45 46
53 54 55 56 49 50 51 52
59 60 61 62 63 64 57 58

1 2 3 4 5 6 7 8
16 9 10 11 12 13 14 15
23 24 17 18 19 20 21 22
30 31 32 25 26 27 28 29
37 38 39 40 33 34 35 36
44 45 46 47 48 41 42 43
51 52 53 54 55 56 49 50
58 59 60 61 62 63 64 57

所有数对8取余数为:

1 2 3 4 5 6 7 0
1 2 3 4 5 6 7 0
1 2 3 4 5 6 7 0
1 2 3 4 5 6 7 0
1 2 3 4 5 6 7 0
1 2 3 4 5 6 7 0
1 2 3 4 5 6 7 0
1 2 3 4 5 6 7 0

1 2 3 4 5 6 7 0
2 3 4 5 6 7 0 1
3 4 5 6 7 0 1 2
4 5 6 7 0 1 2 3
5 6 7 0 1 2 3 4
6 7 0 1 2 3 4 5
7 0 1 2 3 4 5 6
0 1 2 3 4 5 6 7

1 2 3 4 5 6 7 0
3 4 5 6 7 0 1 2
5 6 7 0 1 2 3 4
7 0 1 2 3 4 5 6
1 2 3 4 5 6 7 0
3 4 5 6 7 0 1 2
5 6 7 0 1 2 3 4
7 0 1 2 3 4 5 6

1 2 3 4 5 6 7 0
4 5 6 7 0 1 2 3
7 0 1 2 3 4 5 6
2 3 4 5 6 7 0 1
5 6 7 0 1 2 3 4
0 1 2 3 4 5 6 7
3 4 5 6 7 0 1 2
6 7 0 1 2 3 4 5

1 2 3 4 5 6 7 0
5 6 7 0 1 2 3 4
1 2 3 4 5 6 7 0
5 6 7 0 1 2 3 4
1 2 3 4 5 6 7 0
5 6 7 0 1 2 3 4
1 2 3 4 5 6 7 0
5 6 7 0 1 2 3 4

1 2 3 4 5 6 7 0
6 7 0 1 2 3 4 5
3 4 5 6 7 0 1 2
0 1 2 3 4 5 6 7
5 6 7 0 1 2 3 4
2 3 4 5 6 7 0 1
7 0 1 2 3 4 5 6
4 5 6 7 0 1 2 3

1 2 3 4 5 6 7 0
7 0 1 2 3 4 5 6
5 6 7 0 1 2 3 4
3 4 5 6 7 0 1 2
1 2 3 4 5 6 7 0
7 0 1 2 3 4 5 6
5 6 7 0 1 2 3 4
3 4 5 6 7 0 1 2

1 2 3 4 5 6 7 0
0 1 2 3 4 5 6 7
7 0 1 2 3 4 5 6
6 7 0 1 2 3 4 5
5 6 7 0 1 2 3 4
4 5 6 7 0 1 2 3
3 4 5 6 7 0 1 2
2 3 4 5 6 7 0 1追问

第二组和第四组的第5列的5和重复了,无效

追答

不存在你说的8组数。
递推法,
1到9,9个数字,3×3排列,这样为一组,共3组;要求9个竖排中不能重复出现两个数字,这种情况可能。
1到16,16个数字,4×4排列,这样为一组,共4组;要求16个竖排中不能重复出现两个数字,这种情况已经不可能。
1到25,。。。,不可能。
1到36,。。。,不可能。
。。。
1到64,不可能。

追问

那个1到25,也就是5×5排列,已经被算出来是可行的

追答

我把题目简化为1到16,16个数字,4×4排列,这样为一组,共4组;该题的解答思路如下:

1 5 6 7
2 8 9 10
3 12 13 11
4 16 14 15

1 4 2 3
5 8 9 10
6 11 12 13

7 14 15 16

1 2 3 4
8 6 7 5
9 11 12 13
10 16 14 15

1 2 3 4
11 5 6 7
12 10 8 9
13 14 15 16

假设1,不动,将剩下所有的数分成5组,2、3、4;5、6、7;8、9、10;11、12、13;14、15、16,其中4组可以在某一组中与1同列,剩下3组中不能同列;
不妨同行,则必然不同列;
5组中有一组没有机会与1同列,不妨为14、15、16,它在4组数中同行必然出现4次,而其他任意一组同行出现3次,任意两组同行出现2次;
不妨从2、3、4和5、6、7出发,

两次同行则为

2 3 4 2 3 4
5 6 7 6 7 5
14 15 16 16 14 15
从8、9、10和11、12、13出发可得
8 9 10 8 9 10

11 12 13 12 13 11
14 15 16 16 14 15
至此,所有数都满足规则,最后按照规则插入剩下的数
不妨8、9、10插入第一组,因其与14、15、16的关系,其排列只能为
10、8、9;
同理,11、12、13只能以11、12、13插入第二组数

从2、3、4与8、9、10以及14、15、16的关系看,
2、3、4可以4、2、3顺序插入第三组数或以3、4、2顺序插入第四组,但是插入第四组与11、12、13发生规则冲突;

只能插入第三组

则5、6、7只能以5、6、7顺序插入第四组数

推广到8×8
1不变,后面每7个数一组,共9组
其中8组分别排在1下,有一组多出来 剩下的你再研究研究吧

相似回答