puzzle(022.2)彩色迭代

举报
用户已注销 发表于 2022/08/14 00:12:10 2022/08/14
【摘要】 目录 一,彩色迭代 练习模式 比赛模式 二,一触即发 练习模式 比赛模式 三,同色最小步数 黑白迭代是每个格子只有01两种状态,如果换成彩色(多色),或者换成数字0-n,n>1,则是多状态迭代。 一,彩色迭代 即一触即发单层版。 我们把点击当成加1,那么颜色和数字的对应关系就是:0红 1黄 ...

目录

一,彩色迭代

练习模式

比赛模式

二,一触即发

练习模式

比赛模式

三,同色最小步数


黑白迭代是每个格子只有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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。