首页 > 学院 > 开发设计 > 正文

Polya问题

2019-11-10 16:51:44
字体:
来源:转载
供稿:网友

Polya问题

给定红色和蓝色给八个棋子涂色,求所有的涂色方案,其中某种方案可以通过旋转到另一种,则这两种方案视作一种。

研一组合数学讲的波利亚定义,旋转轮换的内容。

如果用代码解决,可以将八个棋子视作二进制的8位。那么如果不考虑条件所说的旋转算一做,那理论上有255种不同的方案。

同样是筛选法的思想,假设现在一共255种方案,那么遍历这些方案,对某种方案循环左移8次(8次后肯定会回到相同的位置),循环左移得到的数字,我们只保留最小的那个数,作为这个类别的代表,其他的筛选掉。

代码

int RotateLeft(int x, int N){ int high =( x >> (N-1));// 取出最高位 x = ((1 << (N-1)) - 1)&x; x = x << 1; x |= high; return x;}int Polya(int N){ int m = 1 << N; vector<int>p(m, 1);//还未开始筛选 for (int i = 0; i < m; ++i) { if (1 == p[i])//还未开始筛选 { int k1 = i; for (int j = 0; j < N; ++j) { int k2 = RotateLeft(k1, N);//循环左移一次 if (k2 == i) { break;//完成一轮 } if (k2 > i) { p[k2] = 0;//视作无效 } else//k2<i { p[i] = 0; break; } k1 = k2; } } } return count(p.begin(), p.end(), 1);}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表