首页 > ACM题库 > HDU-杭电 > hdu 2539 点球大战-字符串处理-[解题报告]java
2014
02-10

hdu 2539 点球大战-字符串处理-[解题报告]java

点球大战

问题描述 :

在足球比赛中,有不少赛事,例如世界杯淘汰赛和欧洲冠军联赛淘汰赛中,当比赛双方经过正规比赛和加时赛之后仍然不分胜负时,需要进行点球大战来决定谁能够获得最终的胜利。点球大战的规则非常简单,两方轮流派出球员罚点球,每方各罚5个。当5轮点球结束以后如果仍然不分胜负,则进入一轮定胜负的阶段。两方各派一名球员罚点球,直到有一方罚进而另一方没有进为止。
在北美职业冰球联赛中,也有点球大战。与足球的规则不同的是,它只先罚3轮点球,随后就进入一轮定胜负的阶段,而其他的规则完全一样。
在本题中,输入将给出每次点球是否罚进,而你的任务则是输出一个“比分板”。

输入:

输入包含多组数据。每组数据的第一行包含一个整数N(1<=N<=18),表示双方总共罚了多少个点球,N=0表示输入结束。随后有N行,每行是一个如下形式的字符串:
XXXX good:表示这个点球罚进
或者XXXX no good:表示这个点球没有罚进
其中XXXX表示球员名字(全部由字母和空格组成,保证不会出现歧义)
每一行保证不超过100个字符。
XXXX和good以及XXXX和no、no和good之间保证有且只有1个空格。
good、no good都是小写。本题是大小写相关的。
数据不保证点球大战一定结束,也不保证在结束以后立即结束这组数据(即:不用判断点球大战是否结束,只用把罚进的点球往比分上加即可)。

输出:

输入包含多组数据。每组数据的第一行包含一个整数N(1<=N<=18),表示双方总共罚了多少个点球,N=0表示输入结束。随后有N行,每行是一个如下形式的字符串:
XXXX good:表示这个点球罚进
或者XXXX no good:表示这个点球没有罚进
其中XXXX表示球员名字(全部由字母和空格组成,保证不会出现歧义)
每一行保证不超过100个字符。
XXXX和good以及XXXX和no、no和good之间保证有且只有1个空格。
good、no good都是小写。本题是大小写相关的。
数据不保证点球大战一定结束,也不保证在结束以后立即结束这组数据(即:不用判断点球大战是否结束,只用把罚进的点球往比分上加即可)。

样例输入:

6
Riise good
Ballack good
Gerrard no good
Lampard no good
Fernando Torres good
Malouda good
9
Christiano Ronaldo no good
Messi no good
Giggs good
Abidal no good
Carrick good
Ronaldinho good
Rooney good
Henry no good
Tevez good
0

样例输出:

1 2 3 Score
O X O 2
O X O 2
1 2 3 4 5 Score
X O O O O 4
X X O X - 1

提示:
空格数要和样例输出一样,否则很可能会被判为“格式错误”(Presentation Error)。

1、subString方法截取字符串是按照下标开始的。

2、在读入T之后,如果直接用inScanner.nextLine()读取字符串的话,会把回车也读成一个字符串,这个地方需要像c中的getchar()一样把这个回车给吸收掉。

3、在比较的时候,不能直接比较good,因为no good本身就包含一个good。

4、对于XXX Xno good这样的数据需要注意,如果直接截取后面七位就会得到一个no good,所以这种情况需要判断no前面是不是空格。

import java.util.*;

class result {
	StringBuffer s = new StringBuffer();

	public void setS(String s) {
		this.s.append(s);
	}

	public boolean getS() {
		String ssString = new String();
		if (s.length() < 8)
			return false;
		char c = s.charAt(s.length() - 8);
		if (c != ' ')
			return false;
		ssString = s.substring(s.length() - 7);
		return ssString.equals("no good");
	}
}

public class Main {
	public static void main(String[] args) {
		Scanner inScanner = new Scanner(System.in);
		int[][] a;
		a = new int[2][105];
		int T;
		while (inScanner.hasNextInt()) {
			T = inScanner.nextInt();
			String string = new String();
			string = inScanner.nextLine();
			if (T == 0)
				break;
			int temp = (T + 1) / 2;
			for (int i = 1; i <= temp; i++) {
				System.out.print(i + " ");
			}
			System.out.println("Score");
			for (int i = 0; i < 2; i++) {
				for (int j = 0; j <= temp; j++)
					a[i][j] = -1;
			}
			result sss = new result();
			for (int i = 0; i < T; i++) {
				sss.setS(inScanner.nextLine());
				if (sss.getS() == true) {
					if (i % 2 == 1)
						a[1][i / 2] = 0;
					else
						a[0][i / 2] = 0;
				} else {
					if (i % 2 == 1)
						a[1][i / 2] = 1;
					else
						a[0][i / 2] = 1;
				}
			}
			for (int i = 0; i < 2; i++) {
				int cnt = 0;
				for (int j = 0; j < temp - 1; j++) {
					if (a[i][j] == 0)
						System.out.print("X" + " ");
					else {
						System.out.print("O" + " ");
						cnt++;
					}
				}
				if (a[i][temp - 1] == 0)
					System.out.print("X" + " ");
				else if (a[i][temp - 1] == 1) {
					System.out.print("O" + " ");
					cnt++;
				} else
					System.out.print("-" + " ");
				System.out.println(cnt);
			}
		}
	}
}

解题转自:http://blog.csdn.net/zizaimengzhongyue/article/details/18384019


  1. [email protected]

  2. 第二个方法挺不错。NewHead代表新的头节点,通过递归找到最后一个节点之后,就把这个节点赋给NewHead,然后一直返回返回,中途这个值是没有变化的,一边返回一边把相应的指针方向颠倒,最后结束时返回新的头节点到主函数。

  3. 第一句可以忽略不计了吧。从第二句开始分析,说明这个花色下的所有牌都会在其它里面出现,那么还剩下♠️和♦️。第三句,可以排除2和7,因为在两种花色里有。现在是第四句,因为♠️还剩下多个,只有是♦️B才能知道答案。