OJ系列-UVA340(Master-Mind Hints)java版

签到,今天是连续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了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值