回 帖 发 新 帖 刷新版面

主题:国际象棋盘涂色问题

给8X8的国际象棋盘的64格分别涂上各自颜色,要求所有的同一行、同一列及同一斜线(就是象走的斜线)上的方格不能有相同的颜色。请问:涂满整个棋盘最少需要多少种颜色?当棋盘是nXn时,又最少需多少种颜色?
    举例来说,n=4时最少需要5种颜色,其中一种涂法如下:
1  2  3  4
3  4  5  1
5  1  2  3
2  3  4  5

回复列表 (共3个回复)

沙发

假设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

板凳

用递归遍历数组
涂色
颜色不够的时候+一种新颜色,广度优先搜寻所有涂色可能

3 楼


'  构造法求解象棋盘涂色问题
'  参考:冯跃峰著《棋盘上的组合数学》§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.

我来回复

您尚未登录,请登录后再回复。点此登录或注册