puzzle(022.2)彩色迭代
目录
黑白迭代是每个格子只有01两种状态,如果换成彩色(多色),或者换成数字0-n,n>1,则是多状态迭代。
一,彩色迭代
即一触即发单层版。
我们把点击当成加1,那么颜色和数字的对应关系就是:0红 1黄 2蓝 3绿。
练习模式
(17)
先调整成左右对称的,再按照类似黑白迭代的思路,变换第一行的点击次数,然后依次从上往下复原。
比赛模式
简单
先弄出对称的,再完成前三行,看看最后一行是什么状态
如果是这个状态那么就简单了,第一行只把第一个格子点一下,其他格子不动,然后依次复原即可。
普通
先弄成对称的:
再根据公式硬推,第一行一二三格对底层的影响分别是112 133 230,当前局面离目标是303,所以是133+230*3,即第一行的第二五格点1下,第三四格点3下,然后依次按行复原即可。
困难
二,一触即发
最强大脑同款项目。一触即发是3D版彩色迭代。
练习模式
(6)
第一层黄的要换成红的,第二层红的要换成黄的。
第一层点击第一行的2个各一次,再点击第二层复原即可。
(9)
先调成每一层的颜色相同
再继续复原即可。
比赛模式
简单
这个就没那么容易直接调成每层的颜色相同,只能先调成两层都是对称的,再按规律调整了。
普通
困难
三,同色最小步数
如果不设定固定的目标局面,而是只要求所有格子同色,那么最少需要点击多少次?
把点亮所有的灯的代码改一改即可:(J是单个格子的状态数)
#include<iostream>
#include<string>
#include<vector>
#include<iomanip>
#include<algorithm>
#include <cmath>
using namespace std;
int m, n, a;
int l[17];
int temp[17];
int J = 9;
int yihuo(int a, int b, int j)
{
int ans = 0, s = 1;
while (a > 0 && b > 0)
{
ans += (a % j + b % j) % j * s;
a /= j, b /= j, s *= j;
}
ans += a * s + b * s;
return ans;
}
int g(int k, int s)
{
int t = int(pow(J * 1.0, n) + 0.1);
return yihuo((t - 1) / (J - 1) * s, yihuo(t - 1 - k, (t - 1) / (J - 1), J), J);
}
int f(int k, int s)
{
k = g(k, s);
return yihuo(yihuo(k % int(pow(J * 1.0, n-1) + 0.1) * J, k, J), k / J, J);
}
bool ok(int k, int s)
{
for (int i = 0; i < 17; i++)temp[i] = l[i];
temp[0] = g(k,s);
for (int i = 1; i < m; i++)
{
temp[i] = yihuo(temp[i] , f(temp[i - 1],s),J);
temp[i + 1] = yihuo(temp[i + 1] , g(temp[i - 1],s),J);
}
temp[m] = yihuo(temp[m] , f(temp[m - 1],s),J);
return temp[m] == (int(pow(J * 1.0, n) + 0.1) - 1) / (J - 1) * s;
}
int getSum(int k,int s)
{
int ans = 0;
for (int i = 0; i < 17; i++)temp[i] = l[i];
temp[0] = g(k, s);
for (int i = 1; i <= m; i++)
{
int tmp = g(temp[i - 1],s);
while (tmp)ans += tmp % J, tmp /= J;
temp[i] = yihuo(temp[i], f(temp[i - 1],s), J);
temp[i + 1] = yihuo(temp[i + 1], g(temp[i - 1],s), J);
}
return ans;
}
void out(int k, int s)
{
for (int i = 0; i < 17; i++)temp[i] = l[i];
temp[0] = g(k, s);
for (int i = 1; i <= m; i++)
{
int tmp = g(temp[i - 1],s);
for (int j = 0; j < n; j++)
{
cout << tmp % J;
tmp /= J;
if (j < n - 1)cout << " ";
}
cout << endl;
temp[i] = yihuo(temp[i] , f(temp[i - 1],s),J);
temp[i + 1] = yihuo(temp[i + 1] , g(temp[i - 1],s),J);
}
}
int main()
{
int t = 100;
for (int id = 1; id <= t; id++) {
m = 3, n = 3;
for (int i = 0; i <= 17; i++)l[i] = 0;
for (int i = 1; i <= m; i++) {
int s = 1;
for (int j = 0; j < n; j++)
{
cin >> a;
l[i] += a*s;
s *= J;
}
}
//cout << "PUZZLE #" << id << endl;
int m = 123456, mk=0, mj = 0;
for (int k = 0; k < int(pow(J * 1.0, n) + 0.1); k++)
{
for (int j = 0; j < J; j++) {
if (ok(k, j) && m > getSum(k, j))m = getSum(k, j), mk = k, mj = j;
}
}
out(mk, mj);
}
return 0;
}
输入:
0 3 3
7 7 8
5 6 6
输出:
0 7 0
3 0 0
0 2 2
即最少要点14次才能全部变成一样的数字。
文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/nameofcsdn/article/details/126321116
- 点赞
- 收藏
- 关注作者
评论(0)