要求下排每个数都是先前上排那十个数在下排出现的次数。上排的十个数如下:
【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;
}