目录
2象棋(1)16象棋(2)
2象棋(1)
这个不难,直接给出步骤分解:
16象棋(2)
其实就是2个 2象棋(1) 放到一起而已,可以独立的解决,黑格子和红格子之间没什么联系
28象棋(3)
46象棋(4)
这其实就是求皇后的外固集,关于外固数和外固集,点击查看:《棋盘》内固、外固
因为棋盘比较小,所以可以枚举所有的外固集。
代码:
#include<iostream>
using namespace std;
int i1, i2, i3, k1, k2, k3;
bool ok()
{
int sum1 = i1 + k1, sum2 = i2 + k2, sum3 = i3 + k3;
int d1 = i1 - k1, d2 = i2 - k2, d3 = i3 - k3;
for (int i = 1; i <= 6; i++)
{
if (i == i1 || i == i2 || i == i3)continue;
for (int j = 1; j <= 6; j++)
{
if (j == k1 || j == k2 || j == k3)continue;
int sum = i + j;
if (sum == sum1 || sum == sum2 || sum == sum3)continue;
int d = i - j;
if (d == d1 || d == d2 || d == d3)continue;
return false;
}
}
return true;
}
void out()
{
cout << i1 << "," << k1 << " " << i2 << "," << k2 << " " << i3 << "," << k3 << endl;
}
int main()
{
for (i1 = 1; i1 <= 6; i1++)for (k1 = 1; k1 <= 6; k1++)
for (i2 = i1; i2 <= 6; i2++)for (k2 = 1; k2 <= 6; k2++)
for (i3 = i2; i3 <= 6; i3++)for (k3 = 1; k3 <= 6; k3++)
if (ok())out();
return 0;
}
输出:
1,1 3,5 5,3
1,6 3,2 5,4
2,3 4,5 6,1
2,4 4,2 6,6
这4种方案其实是一样的,通过旋转可以重合。
下图是2,3 4,5 6,1,即第2行第3列,第4行第5列,第6行第1列。
61象棋(5)
这其实就是求马的外固集。
关于外固集,以及求解的方法和程序,请点击:马的外固问题
75象棋(6)
这是著名的8皇后问题,详情:內固——N皇 后问题
这里列举一个非常对称的解:
这8个皇后恰好在一个长方形上,不过这8个皇后里面只有最上面的和最下面的是直角顶点,
最左边的和最右边的并不是直角顶点。
88象棋(7)100(8)141(11)
88象棋(7)
这是混合棋子的外固问题。
其他有趣的外固问题: 61象棋(5)、46象棋(4)
答案:
100(8)
规则和上面的一样
只要用2个车控制上面2行和左边2列,剩下的就只是6*6了,这样,就可以利用46象棋(4)里面的结论直接完成了。
141(11)
151象棋(9)
129象棋(10)
这一关,就是要求给出象的内固集。
首先:
整个棋盘可以分成15条斜线,每条斜线上面最多只能放一个子。
但是左下角和右上角的2条线上面都只有一个格子,即2个顶点格子。
这2个格子是互斥的,所以整个棋盘最多只能放14个棋子。
下图说明,14个是可以放得下的:
所以,象的内固数是14。
至于內固集,还有好多:
112象棋(12)
这一关要不重复地走遍棋盘,也就是寻找哈密顿链。
在 哈密顿回路、链路 里面,讨论了关于5*5的棋盘上,马的哈密顿链的问题。
这一关是有唯一解的(其他解法无非就是对称的而已)
首先,这8个格子构成的是一个死圈,一旦进入就只能沿着我画的线走,不得退出!所以,这8个格子必定是最后到的8个格子。
然后,剩下的16个格子也是一个哈密顿圈,而且结构非常简单,就是最普通的一个圈。
所以,从最中间的格子跳入这个圈之后,就只能沿着这个圈,将这16个格子跳完,最后进入那8个格子形成的圈。
159象棋(13)
在哈密顿回路、链路里面,讨论了关于7*7的棋盘上,马的哈密顿链的问题。
最后得到的图:
根据这个图,可以直接得到哈密顿链。
124象棋(14)