签到,今天是连续OJ系列的第四天!
自我感觉这道题有点小难,不过不影响我AC。
题目
实现一个经典"猜数字"游戏。 给定答案序列和用户猜的序列, 统计有多少数字位置正确( 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)
代码
import java.util.Scanner;
public class Uva340 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int n;
int []a;
int []b;
int kase=0;
Scanner cin=new Scanner(System.in);
while((n=cin.nextInt())!=0){
System.out.printf("Game %d:\n",(++kase));
a=new int[n];
b=new int[n];
for(int i=0;i<n;i++){
a[i]=cin.nextInt();
}
for(;;){
int A=0,B=0;
for(int i=0;i<n;i++){
b[i]=cin.nextInt();
if(a[i]==b[i]){
A++;
}
}
if(b[0]==0){
break;//正常的猜测序列没有零,所以只用判断第一个数是不是零即可
}
/*
这道题的难点和解题关键就在这儿,首先正确和错位的特点都是两个序列中
有相同的数字,正确是位置也相同,错误是位置不同,在比较正确还是错误时
是以正确序列为标尺,猜测序列一位一位的和正确序列比较,所以我只要知道
正确序列和猜测序列中一共有多少个数相同,这些相同的数不是正确就是错位的
用总的相同数减去正确的数就是错位的数,嵌套两个for循环且每次都是取出现少的数
累加就能得到两个序列中有多少个数相同,不确定可以手动测试一下。此时得到的B
是两个序列中相同数字的个数,这个小算法可以当做经验积累,=》求两个数组中的相同元素的个数
*/
for(int d=1;d<=9;d++){
int c1=0,c2=0;//统计数字d在答案序列和猜测序列中各出现多少次
for(int i=0;i<n;i++){
if(a[i]==d){
c1++;
}
if(b[i]==d){
c2++;
}
}
if(c1<c2){
B+=c1;
}else{
B+=c2;
}
}
System.out.printf(" (%d,%d)\n", A, B-A);
}
}
}
}
如果能想到(两个序列中的相同数字个数)减去(正确的数字个数)等于(错位的数字个数),那么这道题已经完成了三分之一,另一个三分之一是设计得到两个数组中相同的数字的个数的小算法,还有三分之一是输入问题,对于我这种还没有接触到这种题的菜鸡来说是这样感觉的,慢慢攒经验吧。
输入的话,一开始在想怎么做到题目表述的输入方式,能够适时退出,又输入下一组,写着写着考虑到各种情况就迎刃而解了。
解题的话,得到正确的个数是很简单的,关键是得到错位的个数
首先正确和错位的特点都是两个序列中有相同的数字,正确是位置也相同,错误是位置不同,在比较正确还是错误时是以正确序列为标尺,猜测序列一位一位的和正确序列比较,所以我只要知道正确序列和猜测序列中一共有多少个数相同,这些相同的数不是正确就是错位的,用总的相同数减去正确的数就是错位的数,嵌套两个for循环且每次都是取出现少的数累加,就能得到两个序列中有多少个数相同,不理解可以手动测试一下。此时得到的B是两个序列中相同数字的个数,这个小算法可以当做经验积累,求两个数组中的相同元素的个数
还有一个细节是输出,输出中有空格,目测是4个。
处理好每个问题就能AC了。