题目名称:蝈蝈式的记分 + T+ v, M% Z( q( C
8 p7 C1 H& J* T0 m' h
内容描述: 4 d) v8 ]& P/ k
$ ^( H. E" p0 [蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 8 D0 F" x* y; {9 a9 N! x& b
$ u/ |3 Y* q+ ~4 t0 b9 \5 ?因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
. f0 H7 H1 s; D8 [* \' z
: B) L( {8 X2 m6 r; Q! u( }$ F需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 2 f* f$ h% M& L% }2 i
7 J1 V1 r9 C* P3 W( ^输入数据:
0 U+ Q1 y! _! e3 l) r4 {7 r' T+ o: \( q' K i
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 8 w; @8 P$ R5 c& c
1 d* X X! g+ g v9 V输出数据:
. ^1 B, f$ ^) C3 v: H* b! h) K2 @3 i4 G/ m+ d' o) \$ O
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 6 z# @2 c5 L. ~$ S4 }
( a5 ^4 x8 c9 _6 j输入和输出结果数据样例:
& K6 S! T8 ^$ j2 ^1 V
* ~5 C# a! L) K( g5 H# m输入样例 ' A# }- m6 O" `+ I8 g' u
: M0 Y# W( K% T9 _5 _/ A# y3
, Z0 K$ S$ R) A" }
3 M0 V5 G6 J1 g( y* M23 / s' }" U) A( R/ M
/ i' [/ L% Y4 X1 u9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 + F/ Z3 V* ]8 q: t
5 n! M2 u/ j9 x25
' A2 R, \( Z1 s$ W& I, f- w2 s$ Z
9 3 8 5 4 8 3 9 8 4 X X X X 2 X X X X 2 8 4 9 2 4
. E% f$ i: z! p- ~* ?5 ?9 Q! m1 m) Z2 T9 G A
43 * f9 S# f+ ^2 i
% k; _" W5 u: H. ?" I
7 7 7 7 7 3 4 5 6 7 6 5 4 2 1 3 5 7 9 7 5 3 1 3 0 9 9 3 9 3 2 1 1 1 5 1 5 1 5 1 5 5 1
: `! R* X+ ?+ p4 {0 O2 S ( o9 c ~# {: r1 O' C9 {
" S ^9 l4 H: Z. p) ]
输出样例 , N0 i" v+ O9 {2 y& E X
! n( T+ L& B# H2 T, M* ^21:17
) V& l2 C1 x) n7 v. y$ U ~" s: @: W$ v; ]& T8 ~+ o8 b
24:22
1 K. C; H! v* N7 [6 _0 ^5 ]" Q0 a4 y$ N
21:3 " n& ?, M" D/ O/ C
# B5 \/ t2 c2 R' `' D
Unknown 2 O |2 j2 K6 H" i: Y
" E2 g! ^% v O5 F* _0 F" v8 i21:14
$ Y/ \- a5 ?' t# |! @
1 B8 V8 R1 `# l8 w9 ?20:22
# b: E0 C. z4 @0 g% Q
8 M! ]2 m, a+ b21:23
$ r6 W( w# S* D( P x* J3 c( R3 O; v" g3 k
21:16 ) c: E6 Q% m P0 D1 E. P% D
; O) P! Y q# h! T$ ?7 a21:9 7 f/ q" u0 S; q& ^' b% I% U
0 ?% D% t0 G3 e. g
0 x& \: g* C* i/ bexample: public class GouGouShiJiFen {
7 f' B" Z, Z6 J5 \/ F" k" Y3 v$ b: z$ p3 ~9 c1 A7 R
public int[][] bs = new int[5][2];//当前可能的比赛结果) w* T. e( `5 Y5 r1 ~7 l; p& U
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
4 @$ v: [4 P4 j+ {( `% p" j) X// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
% O& {& e0 a5 C5 h# a- `, a: ~// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown! Z) g4 `7 V+ O0 M5 f/ U0 }2 u
public int numOfAbleJu = 0; //本行比赛可能的结果有几种' y, q8 f/ h( V |- w/ Z
# U. s: R3 g$ C- {1 B: A% h8 s4 e! B
/**
% h$ {# o6 d& i' Y+ Y1 l( U8 p * @param index 连续得失分的index
+ I& f0 G1 p8 K% M * @param scene 第几局比赛
& Q" p1 x# p X0 x$ Z, k* B * @param whichPlayer index处分为哪个选手得分( m5 C$ q' g1 I% k0 v2 d: }1 d6 \, D
* @param record GuoGuo记的一行分
+ I9 K) F+ L' m4 V& {3 @/ M * @return 是否是一种可能的比赛结果
2 u/ [9 y7 H1 v5 C2 @( ~# O# _3 k */0 w! W4 C0 o, {
public boolean check(int index, int scene, int whichPlayer, int[] record) {, g5 U7 K: ^4 K: \8 M3 k1 }
int playerIndex = whichPlayer;- ~/ n" @3 b/ p7 E" E) N
boolean isWanZhengJu = false;
. z, ?, f( k: w( j; [, S6 g for (int i = index; i < record.length; i++) {7 X2 a# `/ R! |9 j, M
isWanZhengJu = false;
+ a9 J8 n4 F2 D# v$ e! p! g% N9 H playerIndex = (whichPlayer + i - index) % 2;
) X1 { `7 U$ r+ i$ z9 p, I bs[scene][playerIndex] += record;* c D4 H# B A9 F" W# J* H
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
( w/ Y7 ^! I, v# j' t if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束8 U3 S+ V/ L/ A) f+ y3 t/ B
scene++;) F* z$ Z& x- v
whichPlayer = scene % 2;
7 I& a7 \+ [/ u5 j( }: [) y index = i + 1;
7 s T/ C) P) k4 B; T( ^: u% v1 G isWanZhengJu = true;+ i4 k' H6 q$ R) S/ z
continue;
& W& H' o) I4 y% q, K } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
" Z/ @* \6 U' A% e: b. P! H return false;1 o5 D' g1 }2 M" a5 q9 |$ B/ N, J
}. K/ G# G* ~2 J& F6 n L) f2 ?
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
3 ^7 W* M6 V! h$ V& J return false;- u7 M/ {" ]6 D; L
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束" m) p2 Y( B0 q" I% u
scene++;$ E7 }" N* L3 B# A# X) |
whichPlayer = scene % 2;
* W# U, ?' `) j/ @ index = i + 1;
& Y. g4 k( c- C" i, C2 F" \& V isWanZhengJu = true;9 ^0 v9 h% k' W- {0 x
continue;
8 T( W5 C1 {6 D5 m# b& S" k/ ^" r1 c }
L7 m @7 c* i. C/ G" B if (record == 10 && i != (record.length - 1)) { //下一个数分情况
2 u9 X) k0 ]5 O! L9 \ int[][] bsBak = new int[5][2];
& q' ]" k3 X9 ~ N0 @9 S cpy2deepArr(bs, bsBak);
4 B$ N( M' {% B/ D- w if (check(i + 1, scene, playerIndex, record)) {& m3 }/ R0 t* ^0 u, ]9 v
cpy2deepArr(bsBak, bs);0 S+ o! w6 {' S. ^
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
+ a$ A/ f/ W6 L' M5 ^; z; o return false;3 y! B; S2 c' S0 z, u; u
}
6 ^6 {+ p' s# e0 p return numOfAbleJu < 2;
9 G' B/ [6 B/ [ } else {
+ P0 u% ~3 v2 [4 p# Y& T cpy2deepArr(bsBak, bs);
0 n7 Q7 @1 l& D/ \5 d2 K if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
# X8 P! R7 |/ H8 F M2 G return numOfAbleJu < 2;
7 g5 Q2 ?/ x5 p8 c, I }$ h& I) Q6 X w9 p: k$ `) l
}
6 w. C% E1 `1 b! m) z return false;
, ]8 O" G' G k6 i# i4 H- T }
, Y. B7 F9 W1 f1 c! R+ Z( X }! k+ ~+ g! C% z5 Y& {7 w! Y
5 e* T8 e9 @; Z* _9 k if (!isWanZhengJu) {0 k1 Y1 _, n0 z3 J
return false;
! v0 i. M }- L. u# k, [! l' I }! g! P+ F1 [0 K ~) O" H
// //检查是否符合五局三胜
/ C, V% a- S g; a// int a = 0, b = 0;
3 |8 y3 [- W5 _# {. t: c// for (int i = 0; i < bs.length; i++) {' b/ Z$ x& S. v
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
8 D- l$ q. a; `6 d// break; b8 g: c' C( F4 k1 k6 g9 X
// } U7 k% D1 X; O8 `/ E1 {
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制& A7 i+ J& x4 K8 [2 o- V
// return false;1 e1 n; I2 @, Z, s* |/ D! Z* D
// }
; e9 q3 U: G8 m// if (bs[0] > bs[1]) {
& `* F. |" L% d8 L3 J8 v3 W) m5 G// a++;
7 o8 F, ?. {) m. x [5 ]: w: B// } else {
7 V4 {$ }+ V8 E5 I2 O// b++;
& y. x; a3 k7 n; f// }
. B# v5 H; |# w1 Y// }
( G, F1 W& x9 P// if (a < 3 && b < 3) {//没有一个人得三局,故错误
/ b% k, c+ m" x" _+ O& r# {// return false;
# O' Y6 G1 S9 t- Y) E// }
) l; l2 ]' C# u& r- ?. c //只要有三局及以上正常结果,则可视为OK
0 ]+ o% W" v4 H) e: D3 X5 h int count = 0;
, ]# O3 H# l$ l for (int i = 0; i < bs.length; i++) {) c. u5 v7 w9 n9 e3 r
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
0 f0 k+ Y5 O& h6 c9 E2 v break;9 E5 Q9 P- f& _# x
}( o; y5 M! ]* ^0 p6 x
count++;- C# P, b) g4 W) X
}8 c; @# i+ V7 G+ a& G! g
if (count < 3) {- ~6 C! C, E' ~: ^9 r! F( w
return false;
' ]; y$ i8 k7 c }
4 a' i/ ~- \5 K. f
. J$ c+ H+ c# W0 P2 K; d numOfAbleJu += 1;
+ x7 F3 W0 a+ a$ W return true;
6 Y) Q( l, }, W+ W. h }
& G6 X2 X2 s$ M! Q0 b6 g( p private void cpy2deepArr(int[][] src, int[][] dest) {
2 ~& I( | B* r" l for (int i = 0; i < src.length; i++) {! {# Q3 H% A$ G* P) W5 ?
for (int j = 0; j < src.length; j++) {) U) O) Q9 c/ a# k/ B
dest[j] = src[j];
6 J; C5 A5 i/ f6 }! \2 G. |1 S% C }
* B$ N4 P: e% {! k. |% ~ }
5 }$ K: Y( l! h- q }1 U" O- {, }2 i" @
% _* o8 j0 e4 l
public void printNowCheck() {
: {8 m9 C g: }: [" s for (int i = 0; i < bs.length; i++) {& v) N( ~: ]; v% T0 J
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
% a0 @9 X" B0 n3 W break;
- s% V' v2 R/ ^, n! P8 L% G }
) c e2 ?5 O; p5 W //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出9 L: M5 R: Y0 w6 N [0 U+ _& N/ w
if (bs[0] > bs[1]) {! L) i+ T& c1 y. [1 \9 m& C" T
System.out.println(bs[0] + ":" + bs[1]);
l% k& a m1 g2 t/ A } else {& @( `3 n* M* C3 @4 T$ C
System.out.println(bs[1] + ":" + bs[0]);
6 a, y# v( d$ W0 V' m }
( q8 Y3 W! ]/ }+ Q }
7 {1 s& E- F; i; H }! V; H2 ?1 U- C6 c
public void resetCheck() {
' m: \7 ]. o1 {. S/ } for (int i = 0; i < bs.length; i++) {/ s2 r- o4 @- Z3 R6 [9 ]2 w; l6 L( c
bs[0] = 0;
$ e0 _) @8 U2 M5 r* G3 K5 O9 R bs[1] = 0;' J- w) n. S0 C+ {0 ~
}0 }4 O9 x" j4 p% G( h
}
! r$ p! Z7 |4 j0 X /**7 ?9 F$ P/ o1 q# v. v& b
* @param args
& M3 J- Y' h- u0 {7 I- m( V6 {, A *// H' v" C, k( N+ F! p5 h; X
public static void main(String[] args) {
" J* p; c$ ^& w // TODO Auto-generated method stub
9 A8 J n* _, S GouGouShiJiFen obj = new GouGouShiJiFen();
& R9 V( c- t/ x% Z7 G" k int[][] testData = {3 T5 l) F. h, n1 {$ v7 `
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
3 U! y0 i. J' F% _6 y {9, 3, 8, 5, 4, 8, 3, 9, 8, 4, 10, 10, 10, 10, 2, 10, 10, 10, 10, 2, 8, 4, 9, 2, 4},
8 B8 p \( x# Y& ?; v {7, 7, 7, 7, 7, 3, 4, 5, 6, 7, 6, 5, 4, 2, 1, 3, 5, 7, 9, 7, 5, 3, 1, 3, 0, 9, 9, 3, 9, 3, 2, 1, 1, 1, 5, 1, 5, 1, 5, 1, 5, 5, 1}
; a! w- U' D3 u };
/ h$ h5 {! ^4 @" c! b for (int i = 0; i < testData.length; i++) {
, j" Z& U: U/ ~) [( S: @. q& u" u if (obj.check(0, 0, 0, testData)) {
( P8 k$ _4 h: S0 S- Q0 d# f0 i! ` T obj.printNowCheck();
3 n: q G9 \ C( b2 k4 [% Z1 y' l3 c } else {
4 U+ s: Q; _& r x System.out.println("Unknown");
( |# M) g, E% v5 d, h }
3 a/ ?( D8 X/ ~' \; A7 o5 D" v obj.resetCheck();
% o. I6 t+ ~( U% f7 N }% W D/ B/ _' a% A7 I
}
* S P( D* |2 H; q
6 }4 d0 m* ~ ~! V9 Z4 r% O% c; Z4 O} |