一.题目
实现一个经典“猜数字”游戏。给定答案序列和用户猜的序列,统计有多少数字位置正确(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