6.给你10 分钟时间,根据上排给出十个数,在其下排填出对应的十个数

要求下排每个数都是先前上排那十个数在下排出现的次数。上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】
举一个例子,
数值: 0,1,2,3,4,5,6,7,8,9
分配: 6,2,1,0,0,0,1,0,0,0
0 在下排出现了6 次,1 在下排出现了2 次,
2 在下排出现了1 次,3 在下排出现了0 次….
以此类推..

这个题目采用自适应的方法,就是自己不断调整的过程;不知道怎么证明一定有解?而一旦

无解的时候就一直循环了。所以我们可以首先判断是否有解,对于本题由于有解,所以我们无需判断。

对于一般的情况:

我的初衷是:开始随机的一个状态a(1)(既0~9下面对应一个随机数字 为初始状态),经过一次循环更改了

他们对应的数字后得到新的 状态 a(2),依次下去……

这样如果存在a(x)与a(y)相等时,必定会无限循环下去;所以我们只要证明 不存在a(x) == a(y)!不知

道这是不是死胡同! 

理论上还有一个性质: a(x) ==  a(y)  等价于   无解,这个貌似没什么利用价值;

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	typedef vector<int> VRI;
	VRI vri;
	vri.reserve(10);

	for (int i = 0;i < 10;i ++)
	{
		vri[i] = i;
	}

	bool UChange = false;
	int num = 0,p = 0;
	while ( !UChange )
	{
		UChange = true;
		for (int i = 0;i < 10;i ++)
		{
			num = 0;
			for (int j = 0;j < 10;j ++)
			{
				if ( vri[j] != i )
					continue;
				num ++;
			}
			if ( num != vri[i] )
				UChange = false;
			vri[i] = num;
		}
	}

	for (i = 0;i < 10;i ++)
		cout << vri[i] << "   ";

	return 0;
}

点赞