一、猜名次问题
题目内容
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
解决思路和代码
思路:暴力解决,通过 嵌套循环 列出所有可能性,从A选手为第一名、第二名........的每一种可能进行判断,当满足条件时,将结果输出。
- int main()
- {
- int A, B, C, D, E;
- for (A = 1; A < 6; A++)
- {
- for (B = 1; B < 6; B++)
- {
- for (C = 1; C < 6; C++)
- {
- for (D = 1; D < 6; D++)
- {
- for (E = 1; E < 6; E++)
- {
- if ((B == 2) + (A == 3) == 1 &&
- (B == 2) + (E == 4) == 1 &&
- (C == 1) + (D == 2) == 1 &&
- (C == 5) + (D == 3) == 1 &&
- (E == 4) + (A == 1) == 1 &&
- A * B * C * D * E == 120) //确保ABCD选手的排名不会重复
- printf("%d %d %d %d %d\n", A, B, C, D, E);
- }
- }
- }
- }
- }
- }
存在选手排名相同,也会满足条件,所以确定A*B*C*D为固定值,从而使结果只有一种(无重复的结果)
二、找凶手问题
题目内容
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
解决思路和代码
思路:假设凶手为A,再通过 题目条件 判断是否成立,如果成立则输出结果,如果不成立则再假设B、C、D。
- int main()
- {
- char killer = ' ';
- for (killer = 'A'; killer <= 'D'; killer++)
- {
- if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
- {
- printf("killer is %c", killer);
- }
- }
- return 0;
- }
提前假设凶手,再通过题目条件,判断,是否三人说真话,1人说假话 成立
三、 杨辉三角问题
题目内容
在屏幕上打印杨辉三角。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
……
解决思路和代码
思路:杨辉三角,每一行的第一个数和最后一个数为1,其余数皆是它左上方和正上方的数的和。也可以理解为,两端元素为1,只需要修改中间元素。
用二维数组可以寻找数的左上方和正上方的数,从而进行相加。
- int main()
- {
- int arr[100][100] = { 0 };
- int a = 0;
- scanf("%d", &a); //输入行数
- //写一个框架,全为1
- for (int c = 0; c < a; c++)
- {
- for (int k = 0; k <= c; k++)
- {
- arr[c][k] = 1;
- }
- }
- //当行数超过2行时,开始修改中间元素
- for (int c = 2; c < a; c++)
- {
- for (int k = 1; k < c; k++) //因为只需要修改中间元素,k等于1,相当于从每一行第二个元素进行修改
- { //当k<c时,也就是说每一行的最后一个数不需要修改,依然为1
- arr[c][k] = arr[c - 1][k - 1] + arr[c - 1][k];
- }
- }
- for (int c = 0; c < a; c++)
- {
- for (int k = 0; k <= c; k++)
- {
- printf("%d ", arr[c][k]);
- }
- printf("\n");
- }
- }