一.题目
实现一个经典“猜数字”游戏。给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B)。 输入包含多组数据。每组输入第一行为序列长度n,第二行是答案序列,接下来是若干猜测序列,猜测序列全0时该组数据结束。n=0时输入结束。
二:样例输入:
4 //列数 1 3 5 5 //答案序列 1 1 2 3 //猜测序列--下面都是--直到结束序列 4 3 3 5 6 5 5 1 6 1 3 5 1 3 5 5 0 0 0 0 //结束序列
10 //列数 1 2 2 2 4 5 6 6 6 9 //答案序列 1 2 3 4 5 6 7 8 9 1 //猜测序列 1 1 2 2 3 3 4 4 5 5 1 2 1 3 1 5 1 6 1 9 1 2 2 5 5 5 6 6 6 7 0 0 0 0 0 0 0 0 0 0 //结束序列
0 //结束符
三:样例输出
Game 1: (1,1) (2,0) (1,2) (1,2) (4,0)
Game 2: (2,4) (3,2) (5,0) (7,0)
实际效果:
Game 1: 输入答案序列 输入猜测序列 输出样例结果---(1,1) 输入猜测序列 输出样例结果---(2,0) 输入猜测序列 输出样例结果---(1,2) 输入猜测序列 输出样例结果---(1,2) 输入猜测序列 输出样例结果---(4,0)
四:重点分析--有多少数字在两个序列都出现过但位置不对(B)
实际就是将答案序列和猜测序列中满足数字位置正确的地方去除。 然后对剩余的进行比较数字是否在两个序列中存在且位置不对(一定不对,对的已经删除了)
例: 1 3 5 5 6 5 5 1 --------将相同的位置去除,即第三列 数目为1 1 3 5 6 5 1 -------查看满足数字同时处于两个序列的数字 1 5都在,且位置不对,所以数目为2
例: 1 2 2 2 4 5 6 6 6 9 1 2 3 4 5 6 7 8 9 1 ---------------------将相同位置去除,即第1,2列---数目为2 2 2 4 5 6 6 6 9 3 4 5 6 7 8 9 1 ---------------------查看满足数字同时处于两个序列的数字 4 5 6 9都在且位置不对---所以数目为4
1.额外声明数组记录下正确序列C和猜测序列D
2.统计数据正确的个数的同时---将对应CD数组对应位置减一
3.将CD数组进行比较,只有C[i]和D[i]同时存在,才认为这个数字在两个序列存在单位置不对
五:代码实现
#define MAX_N 1010 void test22() { //猜数字游戏 int n; //列数 int A[MAX_N], B[MAX_N]; //记录序列 int C[10],D[10],T[10]; //用于去重 int Count = 0; //记录游戏次数 int jd; //判断是否结束 int Count_A, Count_B; //记录正确和出现的数据 while (1) { //输出游戏 printf("Game %d:\n", ++Count); //1.进行输入,存储信息 scanf("%d", &n); if (n == 0) break; memset(C, 0, sizeof(C)); //输入正确序列到A for (int i = 0; i < n; i++) { scanf("%d", &A[i]); C[A[i]]++; } //输入猜测序列B while (1) { memset(D, 0, sizeof(D)); memcpy(T, C, sizeof(C)); jd = 0; for (int i = 0; i < n; i++) { scanf("%d", &B[i]); if (B[i] != 0) jd = 1; D[B[i]]++; } if (jd == 0) break; //2.进行判断 Count_A = Count_B = 0; for (int i = 0; i < n; i++) if (A[i] == B[i]) { Count_A++; T[A[i]]--; D[B[i]]--; } for (int i = 0; i <= 9; i++) if (T[i]&&D[i]) Count_B++; //3.进行输出信息 printf(" (%d,%d)\n", Count_A, Count_B); } } }
原文地址:https://www.cnblogs.com/ssyfj/p/10806860.html
时间: 2024-10-31 03:08:55