主题:国际象棋盘涂色问题
ric500
[专家分:0] 发布于 2006-12-05 12:55:00
给8X8的国际象棋盘的64格分别涂上各自颜色,要求所有的同一行、同一列及同一斜线(就是象走的斜线)上的方格不能有相同的颜色。请问:涂满整个棋盘最少需要多少种颜色?当棋盘是nXn时,又最少需多少种颜色?
举例来说,n=4时最少需要5种颜色,其中一种涂法如下:
1 2 3 4
3 4 5 1
5 1 2 3
2 3 4 5
回复列表 (共3个回复)
沙发
ric500 [专家分:0] 发布于 2006-12-10 09:49:00
假设f(n)代表n×n棋盘涂色问题所需的最少颜色数,那么
n: 2 3 4 5 6 7 8
f(n): 4 5 5 5 7 7 9
冯跃峰著《棋盘上的组合数学》一书,给出8×8棋盘的一个涂色实例如下:
6 2 7 3 1 5 9 4
9 1 5 8 4 7 3 2
5 4 9 1 3 2 6 8
2 7 3 4 6 1 5 9
3 6 2 5 7 9 4 1
7 5 1 9 2 3 8 6
1 9 4 7 8 6 2 3
8 3 6 2 9 4 1 5
板凳
雪光风剑 [专家分:27190] 发布于 2006-12-11 15:27:00
用递归遍历数组
涂色
颜色不够的时候+一种新颜色,广度优先搜寻所有涂色可能
3 楼
ric500 [专家分:0] 发布于 2006-12-31 21:11:00
' 构造法求解象棋盘涂色问题
' 参考:冯跃峰著《棋盘上的组合数学》§3.2 棋盘的Q图
DECLARE FUNCTION check% ()
CONST true = -1, false = 0, maxn = 40
DEFINT A-Z
DIM SHARED n, a(maxn, maxn), m, er(4) AS STRING
DIM i, j
er(1) = "Row": er(2) = "Col": er(3) = "Right": er(4) = "Left"
INPUT "n="; n
m = n
DO WHILE m MOD 2 = 0 OR m MOD 3 = 0: m = m + 1: LOOP ' 确定所需颜色数m
FOR j = 1 TO n: a(1, j) = j: NEXT j
FOR i = 2 TO n: FOR j = 1 TO n
a(i, j) = (a(i - 1, j) + 1) MOD m + 1
NEXT j, i
' 构造一种方案a(),并输出
FOR i = 1 TO n
FOR j = 1 TO n: PRINT USING "###"; a(i, j); : NEXT j: PRINT
NEXT i
PRINT : PRINT "n="; n; " colors";
IF m = n THEN PRINT "="; m ELSE PRINT "<="; m
IF check THEN PRINT "Check ... OK." ' 校核方案通过则显示OK
END
FUNCTION check ' 校核方案a()
DIM i, j, k, l, c(m)
check = false
FOR l = 1 TO 4 ' l=1,2,3,4分别对行、列以及左、右对角线校核
IF l = 1 OR l = 2 THEN ib = 1: ie = n: jb = 1: je = n
IF l = 3 THEN ib = 2: ie = n + n
IF l = 4 THEN ib = 1 - n: ie = n - 1
FOR i = ib TO ie
IF l = 3 AND i <= n + 1 THEN jb = 1: je = i - 1
IF l = 3 AND i > n + 1 THEN jb = i - n: je = n
IF l = 4 AND i <= 0 THEN jb = 1 - i: je = n
IF l = 4 AND i > 0 THEN jb = 1: je = n - i
FOR k = 1 TO m: c(k) = 0: NEXT k
FOR j = jb TO je
IF l = 1 THEN k = a(i, j)
IF l = 2 THEN k = a(j, i)
IF l = 3 THEN k = a(i - j, j)
IF l = 4 THEN k = a(i + j, j)
c(k) = c(k) + 1
IF c(k) > 1 THEN PRINT "Error_" + er(l) + "!": EXIT FUNCTION
NEXT j, i, l
check = true
END FUNCTION
[算例]
n=? 7
1 2 3 4 5 6 7
3 4 5 6 7 1 2
5 6 7 1 2 3 4
7 1 2 3 4 5 6
2 3 4 5 6 7 1
4 5 6 7 1 2 3
6 7 1 2 3 4 5
n= 7 colors= 7
Check ... OK.
我来回复