题目名称:蝈蝈式的记分 ! l2 A V: v7 }4 _" T2 `2 D
3 h/ c* d; H9 q5 H: }( D+ {* P9 C内容描述:
* s* c& Y l5 h$ v8 E- I1 W" S1 Y* H( Y2 G3 n
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
: l5 ?2 M1 W8 C) F+ T/ Y2 o
- }- V5 f4 T- F因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
! D5 Z% p4 ?6 X1 B* h. M$ A1 v
6 S1 M, ?/ x- c9 x4 C% g# H. L需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
/ E1 i/ ~) H m% d/ | @8 E- j. X, n/ {2 C4 A+ u0 R6 m4 x3 j2 Y
输入数据:
% o& {1 i# X8 Z$ Y. b) ^5 S# O& n! M, g. g/ Z# u; H4 Q6 @
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
& K4 W3 P, [4 h/ R9 i& C) r( A8 f" h& @8 T4 A
输出数据:
1 M& C7 f" ]; {& O$ m& B
2 a" A$ \/ o8 ?- w; z相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
& \7 |9 J! a9 z# d# E9 R, s# ?/ D* e* g2 `5 v% W( l* i- W
输入和输出结果数据样例:
- ? q4 C8 X* l4 A5 x7 D+ e: a7 y' g4 ~
输入样例
* l. v- R, o4 k
! }4 B. ^ t9 j- t- W3
9 H# l5 |% J) ?6 T
( l3 ` U8 s/ ?) g23 H7 V' t2 w& o' C0 C3 a9 N0 a
/ d2 c. @ u* R$ o: R$ Z
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 / Y% M6 a2 F& y
2 J0 H( ?* T6 P$ n8 Y" R W
25 % c' X1 [: k+ Y1 Q; i) G2 d$ ?
7 X2 r6 V6 s9 B; b* t4 l! U+ u9 3 8 5 4 8 3 9 8 4 X X X X 2 X X X X 2 8 4 9 2 4
8 m+ c2 j6 y; \" g4 d$ a
$ T" `) Q, k; o. l$ H% T+ f43 ' z7 F. a8 i0 J
' J" a1 e8 }" Z" H
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
& Z% L/ B/ T8 O* e2 H
. p$ G: C- Q0 g$ i$ K9 o( ~5 D# `# E2 K ]$ D/ \
输出样例 5 Y- @0 N/ m/ k2 q x
4 a7 ^6 u& f- I! u
21:17
0 ^8 v5 e$ H" |( D6 B& _7 v: f! z% a3 Q) d6 b8 S! K
24:22 ; G% ~% U; z& {; ~
8 E! S) ^% _/ n& \0 O
21:3
2 P, ^, O9 x0 w5 c2 p3 x# C1 x( i. W q8 q, U9 g% {$ f4 U
Unknown
# h5 K. X0 V5 d Y
3 |. H, z. l+ j3 L21:14
; c$ c9 h+ K K( ^) C4 v, T/ i
, T! c3 w2 e( V ]" o4 x20:22 4 X) `( @* F* Y# g# G: W
+ A; Q: f) V6 k- o( Q5 t: Q9 C21:23
8 \+ [/ Q0 C$ Z* b, `6 a K0 z' k) J) n! [& W0 [9 y: n* ^
21:16
! A6 g8 `& G# @
0 a% ^! R5 w! l# L" F% c. R/ x21:9 / W, F; Z: h8 k8 O
/ Z$ g3 w5 b# ~& W2 a4 l
4 c9 i* g: e! g+ g
example: public class GouGouShiJiFen {
5 c4 B6 h* ~ G) I, i" l |& M' X+ F
0 C1 D# G4 }' ^; T public int[][] bs = new int[5][2];//当前可能的比赛结果( h0 k, D o5 C8 w8 ^6 h
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
0 M: ~( V8 }8 _9 ?& G5 A0 O3 E// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份 u/ [4 Y% C/ \ I$ Q7 b: P% l1 r
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
7 z% @+ R8 |! ^7 { public int numOfAbleJu = 0; //本行比赛可能的结果有几种
3 b3 ~; i7 O* U9 E M! e
) |; R$ W, z0 i% G% ? /*** p. L0 G- i/ O. G9 ?1 Z9 A" @
* @param index 连续得失分的index
$ C6 o ]) k+ F" K, G- R * @param scene 第几局比赛
7 r5 z) l/ W/ T& K3 [$ W * @param whichPlayer index处分为哪个选手得分: T* p: }# p2 q5 w+ b) c/ a* F) s
* @param record GuoGuo记的一行分
/ {8 K; C% N) g4 z8 A; W) z" u * @return 是否是一种可能的比赛结果
" s0 z4 S! X% F9 ~4 |6 U, ?9 D, C */
* e. `' [* x. Y+ A# w) I. f public boolean check(int index, int scene, int whichPlayer, int[] record) {
# H" P: ^& K j/ g- v1 T$ G int playerIndex = whichPlayer;
7 F# m5 k5 k/ _- T+ _: n$ O boolean isWanZhengJu = false;
) b7 q- ]/ Z# p: m8 E! S for (int i = index; i < record.length; i++) {% Z @4 A: Y4 _1 L- S8 X1 Q/ X- r
isWanZhengJu = false;: L1 y3 r/ _. W9 Z: S
playerIndex = (whichPlayer + i - index) % 2;
) C5 x0 W7 D: P+ B8 l bs[scene][playerIndex] += record;2 a$ w# G! f5 T6 F* _# M* L9 ~
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
+ g' J/ x. @# g/ o5 D# N: V if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
0 I, D9 z$ y. s) u \& G scene++;
. O/ Q: ~' y2 r: |% S) F whichPlayer = scene % 2;! P/ }1 x# T+ B
index = i + 1;
+ D8 }$ [5 o- Q5 g8 F isWanZhengJu = true;5 W2 Z' l6 F* r6 t* q9 p9 Z
continue;
9 S# J% R; w& ^7 G, {0 x/ r3 K } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
" G1 E, P/ B1 H6 {' p" g return false;
E" d, B8 u5 U8 D, a }# n! W) ]5 |4 y' M2 a- f. f
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的7 A j, a2 h+ V% e3 C1 H+ f& L
return false;
6 c% M: S ~+ s; g5 y } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
, W" K# _- D$ [1 K+ f1 f scene++;; t) ^8 f& v& Z
whichPlayer = scene % 2;$ L* G0 Z$ z5 G+ ^& R* R! m
index = i + 1;
9 ~7 r1 F8 g- d* a isWanZhengJu = true;- u: Q( x0 ^, p6 F& U
continue;- F# l4 X% H; i* Q6 k+ C* ^: v5 P
}4 r! s& ~' m( {4 }. W2 f
if (record == 10 && i != (record.length - 1)) { //下一个数分情况
: E( _& o/ E2 L. g- w/ U int[][] bsBak = new int[5][2];
1 [8 G& N5 ^9 r3 ?* X( W cpy2deepArr(bs, bsBak);$ n j( w2 L r, m- x3 a( ^5 |+ q
if (check(i + 1, scene, playerIndex, record)) {1 _: V, U: ]* h+ b8 F, {, {/ k
cpy2deepArr(bsBak, bs);8 E3 \0 _/ a* A, ^- s: `, P
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
) |% ^6 j8 t G/ Q' o( y( i return false;
3 V. l/ i( U) G }' K( h+ Q y) i. ^9 v9 I2 b8 m" r
return numOfAbleJu < 2;
+ `! S1 O1 H. {- S/ q) o } else {
* a! k9 ?$ V2 @; ^+ {8 N x cpy2deepArr(bsBak, bs);
' x3 [, O: h6 `' k3 L! ^+ Z9 d. C if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {& z4 k3 {: g; Z. u
return numOfAbleJu < 2;
$ \5 r7 a% [. o& R* s }& i! `0 a% H9 g. {7 y
}# {# E8 c2 d6 D7 W5 `
return false;- d1 X. g5 W) V# R5 x( M7 }
}, p+ p/ c; ?- w& X& Q( Z4 c
}) B X$ p' [1 l+ P J( }7 q
2 ] {2 y) z! T% A$ ]: c& R
if (!isWanZhengJu) {
' o& g6 i9 _& k/ x, n, B return false;
. w" y! {" H- g: P K }
* Z# V( c4 n _$ Y. `// //检查是否符合五局三胜
: {/ z0 b3 d2 f- o. T$ s* @4 W// int a = 0, b = 0;
) K; ^9 g9 I8 K1 J2 e! E// for (int i = 0; i < bs.length; i++) {4 o1 W2 F7 N1 k1 W V
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了" e6 e& G* q* F, F# D% `
// break;
* d# H4 Y `! N9 d" l. |* V# ?// }
0 H! Q5 L6 v [* }- U// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制% w) f- P3 a7 R+ E
// return false;& `) I+ E0 m5 p5 w. B
// }
! C% z! D% S* |2 P// if (bs[0] > bs[1]) {
) N7 m: M% ]6 @% E$ N// a++;
- i% t; ]8 s3 F5 @8 P3 Q// } else {
. ~' [( w1 |8 M M1 ~6 A) X& G// b++; }4 ~- s$ i4 s: Q
// }
3 e$ R8 t5 l7 p o; W8 G- k// } D0 n* i5 U d$ I! Y
// if (a < 3 && b < 3) {//没有一个人得三局,故错误
, @6 q: m2 N N% r// return false;
: V% ]) Z" n9 _- U8 ~! I2 z' v// }# a: }) r H. n+ Z: G9 T# ` k. f# i
//只要有三局及以上正常结果,则可视为OK
% p" ^3 e* b8 k: I int count = 0;
, ]$ j; T; U: E for (int i = 0; i < bs.length; i++) {" N3 K& G0 w" j7 G* c2 a5 u& ?$ l
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
8 }9 T Z. W8 q( \# K6 Y break;* B- W _; l4 O! d' R. I! c0 ?
}9 G1 ]: K2 A0 m( v4 e) ?4 W
count++;
% z( @0 Q, ~9 @2 T* C: k5 j+ `; m, ` }
6 v$ F2 P* J0 S, m4 B; E* W if (count < 3) {5 s* O, d# _' K
return false;
- m1 D8 u. j2 X+ u; y }' k4 i2 g8 K: c. y. U
+ d" A1 W( B: K: l* Y' J$ x0 O numOfAbleJu += 1;& E: Y% B2 s, e7 B, h2 x. ]
return true;0 P' b" o, F8 @; m; D/ q) S: H
}- y, t5 f# W* \8 R2 {
private void cpy2deepArr(int[][] src, int[][] dest) {
/ C( X j( v0 z" @ for (int i = 0; i < src.length; i++) {
6 X8 s& P5 ^) ^+ L4 t0 z1 l0 ?" T } for (int j = 0; j < src.length; j++) {
V# z4 [6 g$ ?2 H- y' w4 q7 i dest[j] = src[j];) b9 u& G# o- `7 V% V3 X
}8 z. y% |2 C z6 c& N5 w0 J& F0 R0 y8 L
}+ f! ^& K: [5 q8 V2 N7 i8 B
}
* c5 i6 ]. H- a % Q6 M1 s9 Q- l
public void printNowCheck() {+ ]2 [; X5 C! J9 M$ e6 s F6 o+ K% j
for (int i = 0; i < bs.length; i++) {
3 ~7 L8 o0 A/ T; {- C% H if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了# d# T- P2 o8 \& d
break;5 A( T8 [# j1 R, J3 p- I& y
}: v7 J- W) i5 m
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出3 T; q2 R t# n. o" v
if (bs[0] > bs[1]) {
( P* C: k, b+ F9 w0 M System.out.println(bs[0] + ":" + bs[1]);/ c2 u5 U6 ]1 ~( s2 o. C- k8 I! ~
} else {
5 R- n: p- H* v3 X7 V System.out.println(bs[1] + ":" + bs[0]);0 \, I: o- W% P8 c0 c) G
}4 p- x6 J: _' K; F/ Q; P' X7 z6 Y+ x
}& u- `8 B0 |% }# n/ Y3 D3 V# b3 }
}5 Y6 k' |8 x' d7 u# E
public void resetCheck() {0 x' O5 Y W: \, ], X5 O6 n: v# e
for (int i = 0; i < bs.length; i++) {5 ^+ Q4 k2 I1 t6 v& q! P
bs[0] = 0;5 Q8 O. \9 H& e9 F
bs[1] = 0;
3 H* ~ ~2 I! U$ q0 P4 E6 `; a }% d( u J! F) {. `9 p7 g: `
}" S' J, V# ]" w2 s# b& H
/**
4 }+ k, B" A; U * @param args* @8 P& A( t$ }* J' }% L' o
*/6 B& H% v9 r# j
public static void main(String[] args) {$ L, I1 t! ~/ E" n
// TODO Auto-generated method stub: p; k4 w c7 i5 N, z4 [' i; ]5 A
GouGouShiJiFen obj = new GouGouShiJiFen();
2 k7 B$ U" b# g. Q int[][] testData = {
6 r7 n* S% k3 {6 i% { {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},7 T& D& g: h7 u; j6 v
{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},$ c+ @0 X2 K. C5 _
{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}
) x- T: y% e5 z: S& [ };7 |" t$ s$ L/ K; |6 B" {5 e3 ~8 E! r
for (int i = 0; i < testData.length; i++) { n3 ?5 b6 }* R7 `
if (obj.check(0, 0, 0, testData)) {
6 E# u1 _1 f K$ a obj.printNowCheck();# z! c: N* C" m6 k+ L% t
} else { B2 H% F4 ^2 U$ |" F- }
System.out.println("Unknown");
) U+ a6 \0 {# O8 U+ X }
% p0 k2 Q; G4 Q$ n& L0 y- z4 ]2 J2 J obj.resetCheck();
' I+ x% W( [: Q( a5 ?" s ? }+ z6 g8 R0 Y9 Z* Q: u
}) y# U- z+ C# P7 ?6 n
7 j0 |: \4 f# }. [4 e} |