1.猜名次
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
分析:有五个人直接模拟推理有点难,所以用计算机的遍历,将每个人从1到5来一遍,有5^5种可能性,用5层循环就可以了,但是这样会导致一些不期望出现的结果出现,因为我并没有查重,所以会出现两个人抢名次的情况,也就是两个人或者更多的人名次相同的情况,例如两个第二,三个第三这样的,所以即使满足了条件,也要查看一下五个人的名次是否重复,这里用一个函数来处理,只要五个人名次并列,返回0,否则返回1即可。
int checkData(int* p)
{
char tmp = 0;
int i;
for (i = 0; i < 5; i++)
{
tmp |= 1 << p[i];
}
return tmp == 0x3E;
}
void diveRank(int* p, int n)
{
if (n >= 5)
{
if ((p[1] == 2) + (p[0] == 3) == 1
&& (p[1] == 2) + (p[4] == 3) == 1
&& (p[2] == 1) + (p[3] == 2) == 1
&& (p[2] == 5) + (p[3] == 3) == 1
&& (p[4] == 4) + (p[0] == 1) == 1&&checkData(p))
{
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d ", p[i]);
}
putchar('\n');
}
return;
}
for (p[n] = 1; p[n] <= 5; p[n]++)
{
diveRank(p, n + 1);
}
}
2.猜凶手
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
分析:假设凶手是a,b,c,d其中的一个,看是不是满足条件,如果满足就找出了凶手。
int main()
{
int killer = 0;
for (killer = 'a'; killer <= 'd'; killer++)
{
if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3)
printf("凶手是:%c", killer);
}
return 0;
}
3.在屏幕上打印杨辉三角。
分析:通过找规律得到d[i][j] = d[i - 1][j] + d[i - 1][j - 1]。
int main()
{
int i = 0;
int j = 0;
int arr[10][10] = { 0 };
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
if (0 == j)
arr[i][j] = 1;
if (i == j)
arr[i][j] = 1;
if (i > 1 && j > 0)
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
}
for (i = 0; i < 10; ++i)
{
for (j = 0; j <= i; ++j)
{
printf("%-3d ", arr[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}