题目名称:蝈蝈式的记分
, S) y/ ?, x1 s/ V5 A1 e' h0 U7 C$ r& e. a8 a2 C' n' d- z+ m
内容描述: 6 e7 q- u' @ j. N
$ T3 P1 W) u0 t1 k# ^* m& q! \蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
+ W* p( A% y3 C5 x) S( K- K1 h5 o9 o
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 ( T8 L6 W+ L; l* a- E
( k( a4 F. t1 r! X# F3 b2 d% d
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 . B% a" r7 j' m
0 ]2 x3 R) ^: h) X y9 I8 l$ r* x9 Y输入数据: / ^0 Q" q1 T5 o e# r/ C* s
$ i. r5 c6 \ E2 A
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
- Z# |: |7 |, G3 K9 p# J
4 @0 k! r/ x$ }$ W; d7 k输出数据:
' A. ]* N# Q) p4 p: H4 {$ h6 T% T
9 N5 u8 I) v/ P* [8 |$ e相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
$ T8 h- ~7 o- y3 ~ Q' n2 ~1 Y
[$ R2 F( J+ ~. T. r3 W5 I输入和输出结果数据样例:
. m( q0 b* N7 ^5 g( k8 `) E$ h* h/ M; P3 x* k5 V
输入样例
! D i$ {) {! v3 C$ `* o; }# Z4 J5 @. t& E c3 H R6 p
3 / e1 l/ I9 i# i, ]5 L2 z3 f4 F7 K
8 G+ S8 _( }- B w4 F+ T3 G9 N23
. w7 r7 r/ _. s0 W J
" R; D4 l1 |$ k1 B" m9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 , ~3 V# [3 O9 |1 U
' J; u1 e7 r9 `7 k1 Y
25
; G+ u O/ s0 V- F7 ~* y {) q( |! q: P, M$ g0 c8 @
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
( K; ~8 |$ S! x( j$ p
' t5 h: m X( F2 }; w) Y" N43
& A3 k3 u* \' H% E* d+ M( z( w9 c) b4 H1 q, | U+ 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 6 m* E! X2 }+ Z& A- Y8 S
5 u/ Q* H- G: T+ l0 M: J6 D* x. R! w6 p$ v/ @0 {+ L7 z
输出样例
% p) U+ d) F+ k' D0 S
& g+ {6 ?6 E% c( D( Y2 a21:17 ! E" M) H4 ?2 M
) W& Y1 t- L! ^4 ~& c) t" L
24:22
2 ^ _% o8 Q" ~7 @7 b
+ E( o5 ?% d' A" `; v+ H/ h21:3 , m& }( N4 m& k8 w* ~
- q: C$ r& R5 E! _% a- o2 o. {- W GUnknown : f- A, j( h9 ~- v& J, U8 X, ?
! w. O# Q2 y7 W F0 j, W2 X
21:14
b) b& W' i8 z; k9 F, C2 F5 G
/ c$ E; S2 n9 S/ D20:22 ) u/ J1 Q8 |9 C. | O3 C
# l: a3 t: i1 g+ Z" Q; t$ h- v# O21:23 9 r# d9 O# i J9 J% f) E I+ O- j
$ t- Z) w6 w; S3 M, N/ ~7 S9 B21:16
! t+ }# ^* d, P: ]8 l+ T& a: s' ?, H! u5 A7 K. b) [2 X2 e7 T4 e
21:9 1 J1 M9 ~5 Z/ G
! }5 C% f% l C; p- Y" U F! V; b' l
. t7 e+ F! P6 c5 L' Oexample: public class GouGouShiJiFen {* x) h1 U9 \* w# g
0 m0 Y6 w' o5 u public int[][] bs = new int[5][2];//当前可能的比赛结果( U$ ]& f$ v/ h; n! F: m u
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果" {9 Z% z" `; c$ m) |
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份, a$ Q: N: \9 Q. L3 }8 |* c
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
0 B# k, t- ~. I: v7 V2 n/ J public int numOfAbleJu = 0; //本行比赛可能的结果有几种+ t3 U% t, u' m1 u6 @7 W) a! o5 i
' u# R$ }4 J& q+ h' P /**8 e1 G% g$ d6 p, x
* @param index 连续得失分的index, J( ]* q/ R X3 d5 _
* @param scene 第几局比赛7 _1 }, i" |% ?9 H v3 D, Q4 e/ q
* @param whichPlayer index处分为哪个选手得分
7 F; T% h' Y/ X w/ H. a( O * @param record GuoGuo记的一行分3 d. y. t4 W/ p9 v
* @return 是否是一种可能的比赛结果( x2 d4 A" C5 `) d6 }( O# r" J
*/
; ]8 t7 u2 B1 Z public boolean check(int index, int scene, int whichPlayer, int[] record) {" C& T- E+ c' A5 ^8 W) ~( O
int playerIndex = whichPlayer;% D, ?7 q1 e4 t$ I! `
boolean isWanZhengJu = false;
: C! X T' `4 p* y& v for (int i = index; i < record.length; i++) {" o* w& o- `4 b2 z$ d; r# i
isWanZhengJu = false;
: F# B0 B# G( b/ c; c1 H' ?# k. Z playerIndex = (whichPlayer + i - index) % 2;
8 z: n" z5 W* O8 [; n } bs[scene][playerIndex] += record;/ t1 S* N% K6 h, }
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
& d- S0 v3 U+ X$ ~$ f, ?' p if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
?$ v1 Y# ^7 m$ D" ]0 c6 D& B scene++;
+ O$ O) c6 p/ \6 f$ n whichPlayer = scene % 2;9 `" U9 p( u5 S6 P6 ?
index = i + 1;
/ ~7 x; s( q4 [) c* ? isWanZhengJu = true;
$ m+ \1 b0 g1 G3 x$ \" G( U" n continue; J1 ]; \6 Y# X8 `. A2 p7 b2 u
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的( S5 f* C& W0 w
return false;4 |6 G% `9 z+ E' T
}2 q" O/ a: ]5 j( z; i$ @4 [) e `& t4 \
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
0 H. S5 f* b' E& r# C return false;
/ h* {3 e! I9 f9 a6 V) V7 D } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
' t$ ?; Y* V" L4 k1 E {0 b scene++;; j) t6 b4 s! N8 {, N" W$ M. l' w
whichPlayer = scene % 2;
5 s- Q7 r0 ^* T6 w' i J. k, b8 t index = i + 1;, i$ R L+ u$ E; j, m# z
isWanZhengJu = true;' b" [* i* M) b0 T) z6 y+ _. }
continue;
- b, ?9 g1 `. Y( A9 \ n% j }
; i/ t9 V$ r" W# i9 N if (record == 10 && i != (record.length - 1)) { //下一个数分情况
( ~& n$ k* c) M G3 ^. h: ] int[][] bsBak = new int[5][2];
$ }% j; g- p% I. Z4 e cpy2deepArr(bs, bsBak);
! k% @+ Y" a& ?: Q if (check(i + 1, scene, playerIndex, record)) {) J5 _; e- q$ _
cpy2deepArr(bsBak, bs);
, x% }+ ~) w) V5 |7 q$ n if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
4 W! V, [. b0 l9 h, `1 x3 R$ K. t return false;
+ N3 f! Z3 h4 \6 R }; }% e& A8 n5 M5 |5 `9 b
return numOfAbleJu < 2;
2 s% U" g4 O% o. s2 b7 u' @, ? } else {. O6 K" b A- Z8 N# h) W& {6 q
cpy2deepArr(bsBak, bs);; R7 p& z; u, w* o* x
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {! h2 i7 `+ n" u! |, T% u
return numOfAbleJu < 2;4 @) e4 E) n& k( C, I% D
}
2 _& ^: q: s; P8 K1 S }: k6 a2 D/ C0 h8 X% O
return false;7 o8 _) [* O( J3 m1 |
}
2 X6 a4 h7 ?) H: ?1 R2 _' ? }6 p, O5 V4 L; D+ D
0 ~% N8 v$ ^9 a9 X% d if (!isWanZhengJu) {' t Y# n2 |; v/ c4 z4 \8 ?
return false;
* o4 @* I& X9 v/ \1 {/ ~ }+ _! c- T3 r3 [/ j( T9 a
// //检查是否符合五局三胜
! d0 K( q& W$ _9 \& y// int a = 0, b = 0;
' y7 |; e5 }% m! b3 x4 [" P; b+ f// for (int i = 0; i < bs.length; i++) {$ R! M; `" `; v0 b
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了8 r. y3 {4 v5 |2 E8 s! V
// break;
; `& T2 h& b0 }9 q7 W7 Q3 L8 k- X// }( \0 V, Y; g: K" c
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制3 _& ?! ?! X+ ~& T0 o) P8 r- s$ g
// return false;
6 W& L S% z; {1 W; i1 }, w// }3 w& a4 W" ^' d
// if (bs[0] > bs[1]) {
( Q1 @+ R4 C5 ^1 M// a++;
8 d/ y( X- s( l# j+ i# H// } else {
- ?6 c8 Z: s% D5 n0 b// b++;
) ?4 p7 C3 u- p5 q- o( C( M// }
$ s2 ~" _* |! o: C: v// }
E, d9 t, v Q5 m, {) E// if (a < 3 && b < 3) {//没有一个人得三局,故错误5 C% c7 ~0 c7 g) Z
// return false;
3 K& u9 d/ @& I& s+ d! T( V" C) P' w// }
' O* R; n B( }( x" W0 v+ S //只要有三局及以上正常结果,则可视为OK
( o6 O% V2 k3 U) U# @ int count = 0;
6 r: X( d4 H% u. @! m" f. y* F for (int i = 0; i < bs.length; i++) {
- F0 E( E' h, r2 W0 u! A if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
+ L; f* c# o% {+ e1 Z break;$ s, E8 J7 s4 V+ u
}. m0 `/ G' g% U$ S
count++;
- w/ M% r3 z6 f }2 p) v/ ^: Y* u
if (count < 3) {
. G1 C2 X( p4 f5 J2 w return false;4 x" E5 Y. M) N: i4 I. J
}
0 X. f* T m \ ~5 z5 O) Y- Y
: n, W( @3 o G' |$ g. S5 j numOfAbleJu += 1;, O; p4 B4 y4 N3 l
return true;0 ]9 \9 [! m/ `" |- |( i
}
& L& Z7 P n) ~) j private void cpy2deepArr(int[][] src, int[][] dest) {5 _& s& i$ r: k- z
for (int i = 0; i < src.length; i++) {
: s" [: y& L: k for (int j = 0; j < src.length; j++) {0 v) K4 C% M5 `1 i2 X5 \2 j
dest[j] = src[j];" T) q. @, B" e0 G) e
}
3 j: \$ |. }. D* k: ^ }
# _$ t* o" o- Q4 d5 o }
- \/ ?8 l8 Q- e& h+ a$ U. t1 | & s' g% P) I `
public void printNowCheck() {
( r! m! Z! g3 Z( N for (int i = 0; i < bs.length; i++) {3 w' b* a0 w) R
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了: J# b1 R9 F9 ^8 d
break;+ f- p! n! g; B
}0 A) W9 L! P2 u v- t. H' ^
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出+ b7 I5 f! D5 v* ?% i+ x
if (bs[0] > bs[1]) {$ S! {, G! p/ c0 w" i; d
System.out.println(bs[0] + ":" + bs[1]);
5 N% H; X" e5 Q& a! ^8 v6 p( I1 j } else {
0 t" ?4 O; o" h, F% f System.out.println(bs[1] + ":" + bs[0]);$ F. E7 m# o: z8 J4 C; E
}7 t2 N& Q3 c9 A) @# l
}
3 M5 A% M/ l. B- a7 @ }
7 Y$ ~4 J/ v# o9 K public void resetCheck() {
' M8 {% I# L0 O* s, r d( \6 M for (int i = 0; i < bs.length; i++) {
" o4 c5 Q( Y E$ q- r' j4 W bs[0] = 0;0 T3 @9 l% a: m
bs[1] = 0;
1 P4 ?1 T) v% G }
: x% |$ a4 Q' v9 x }- v7 H3 ]+ L" X
/**
7 }9 x8 k0 Z3 }+ b$ a * @param args
: O& n7 Z, q$ e) ~: ] */
& O9 u! X9 c7 b z public static void main(String[] args) {8 }2 [( O `# D3 L+ U
// TODO Auto-generated method stub
! C2 Z: h; x! U6 a* g% a- t+ T; y0 @5 ] GouGouShiJiFen obj = new GouGouShiJiFen();: u. _& Q- a+ E+ [$ `3 y5 {
int[][] testData = {/ v& n3 q3 D+ |/ ~8 y* m8 L
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
4 v1 V0 V+ K l( c {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}, c2 n; A* X' Y' x2 M9 J' ?& T
{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}
% l' E2 `/ |1 d% X8 w& M( l };
3 i: e% ^. N1 `$ L0 `' E) ` for (int i = 0; i < testData.length; i++) {1 J% `! o$ X9 s8 d8 }
if (obj.check(0, 0, 0, testData)) {& I* }1 s& K' P5 s+ z+ z$ T, r
obj.printNowCheck();
, \3 Q( W4 S) b2 \$ W; \5 z } else {
. N% j, k( K0 ]( f v System.out.println("Unknown");( H( \( E; y, H' C" N
}
2 ^' h N) l* M) q* i- s$ `0 I obj.resetCheck();( {9 Q y( q' ?# D7 N% V
}
- _! G# s8 {' F: j }+ _7 K: Z/ B3 @4 d: z. a
/ z. S% r8 l/ }: `. [: F/ k} |