4红牌、4蓝牌推理

有4 张红色的牌和4 张蓝色的牌,主持人先拿任意两张,再分别在 A、B、C 三人额头上贴任意两张牌,A、
B、C 三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,A 说不知道,B
说不知道,C 说不知道,然后 A 说知道了。
请教如何推理,A 是怎么知道的。如果用程序,又怎么实现呢?

以下推理很NB,转载自:http://topic.csdn.net/u/20100426/11/b47952ac-47f6-45bd-8874-6d36f8996870.htm[......]

继续阅读

全部和的加法数字组合

输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来。

就是回溯么,这回路径改用stack数组模拟做了。
// n numbers, print all sum=m
int stack[1024];
int pos = 0;
void sum(int* arr, int n, int m, int i, int s)
{
if(i==n || s==m)
{
i[......]

继续阅读

在一个字符串中找到第一个只出现一次的字符

在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。

题目不难,主要是两个条件,注意只出现一次,并且要第一个这种字符。

用stl的map什么的有点不合适,简单数组map即可。
char str_first(char* str)
{
char* ptr = str;
int map[255];
memset(map, 0, sizeof(int)*255);
// First O(N), count
while(*ptr!=[......]

继续阅读

约瑟夫环问题(数学解法)

约瑟夫环问题:每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第 m 个数字。求出在这个圆圈中剩下的最后一个数字。

据说之前,这些数字是死囚,能抽到最后一个的人能活着……

模拟的方法弱爆了,有递推公式的,假设有n个人,每轮第k个人被杀掉,递推公式如下:

如果想知道推导过程,可以看维基百科:"Josephus problem"

即初始sum=0,我们从i=2开始(i就是上面公式的[......]

继续阅读