题目名称:蝈蝈式的记分
' B' N2 k& V6 ]3 @* f3 r1 C& A2 d( z
内容描述:
# o8 y! H# Z F7 {7 l# U
8 E% `4 o% H& U$ v/ ^; r$ V F蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
- K- w4 f) g. k" f f: h/ x7 d. J7 w7 b1 k; _8 C% R8 ~
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 & j3 I1 \% \ C; E0 h4 k
) r, B- v) ~3 f; }. i需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 + O4 z) O1 V8 R) y3 [/ {! p: `, [3 u
8 h8 ]# R+ N( u/ m( Z6 o输入数据: - i0 v i4 x' X, w4 A, F
' ~* D7 s2 u) C& d6 f
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 * A/ r' q% E8 v* V8 m) d
) @. U% Q$ [5 N6 X% ^0 H H" v输出数据: ( D: `" l5 \3 P; V8 s8 d! r
0 l/ @* {3 f+ S
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 # F" a; S( S+ \1 h0 Q! s' Z5 y
6 _, g" y2 n7 t) j! k: a
输入和输出结果数据样例: $ j% e0 ^7 S/ N# T. {
( ?, d8 y- n2 R输入样例
4 K9 Q8 a2 X2 o1 Z9 P! v4 W8 {. l
3
4 c4 D# z! E* _6 @# I8 w( l, w! j2 S8 P) @6 m2 J
23 ' B- G& g& P2 ~
' F8 E5 j+ E8 Z+ N+ p9 D7 t
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
. |1 W- r3 I x! I5 u
$ Y3 J/ q, [9 m% F7 y25
* a9 K: }. M9 R1 C- g; ?5 r( b! M. S' [& L, |9 d2 M, ]
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 " Y; Q& W9 R6 i: k( `
4 J; x% ^% U" v O% b' @
43 ) M4 n3 P" b, I
1 M* d i/ K5 R/ _
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
! E% f7 e: `5 }) b7 X! {
4 \5 O8 g. {! C* s. j4 I
5 m9 F3 W7 o: e+ _输出样例
7 ?: ]; q& _! {: Z: v* H$ w6 S @" I+ _+ y0 t; ` |8 m! z
21:17 1 a8 W# O G% f* f# {
& F9 N: `/ O, E& G E7 W1 c) P
24:22
% \! j, u9 P: G; J. G( J6 k% m' l l; P% `+ `5 h
21:3
# J+ u3 j' F7 G+ s6 w( h
! Z& v* H4 W7 W# qUnknown
2 O( P) ^6 B7 e9 R! B1 F5 A- H$ k( ]# h% R. W0 w' t4 k9 w% y
21:14 : a% G5 p7 R4 T
+ ~$ Z# k* ~( f" I: y$ S0 G' K. R8 W20:22 0 z# q- `! |/ G! V7 D
: u. j4 S9 r9 }9 o- o& T% s21:23 ! B* {( Q* ^+ B1 Y) I
; ~9 P5 y. f" |3 Z P: s9 V
21:16 1 Q+ B* p) Q" m- G5 N$ m
2 A8 Z; F. F! D3 C5 d
21:9
6 K' n5 d8 N$ l6 c' B8 q; V7 |# V8 s
9 A" Y! N; o$ B- m3 U5 Q% [
' i8 N7 O/ Z0 ~( b! b* Q& r5 ^) bexample: public class GouGouShiJiFen {
) O) Z ^+ o t% I/ @, G5 z+ R
. X- A+ y9 V `8 g# @1 T# v4 ? public int[][] bs = new int[5][2];//当前可能的比赛结果( _$ t& e# X* Q
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果+ Z$ {/ L6 N: g% C9 n: n, j
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份$ a9 ]/ l- d% q3 ~% e4 J
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown% L7 ~9 B: X9 v, ^- Y
public int numOfAbleJu = 0; //本行比赛可能的结果有几种
$ s. m7 d5 a; {( o. \$ l! W
8 t5 B6 x% R& W3 C# Q /**) t& T9 a8 s+ i- B8 _
* @param index 连续得失分的index
( B9 i2 T. x& j3 R7 t1 Q" R3 ?" N * @param scene 第几局比赛. `) U% c; K2 ]3 _2 ?0 ?
* @param whichPlayer index处分为哪个选手得分
7 H/ ]9 ?# A' I7 Z$ C5 { * @param record GuoGuo记的一行分
: X% J3 C9 i6 Y# z0 n* y' I& B * @return 是否是一种可能的比赛结果7 I) z4 a# J0 ]5 ^
*/. T5 j* c2 A( V0 P& R3 m4 }- w& p
public boolean check(int index, int scene, int whichPlayer, int[] record) {6 E7 p5 K, a( ]8 J
int playerIndex = whichPlayer;, c. K/ ~& q Q8 p
boolean isWanZhengJu = false;/ H; g! m9 e. U( ^# s. ]0 g
for (int i = index; i < record.length; i++) {* V8 G. Q' t7 \8 j
isWanZhengJu = false;
: \& Y: p8 o( Y5 b& B* a' Z2 ]1 X playerIndex = (whichPlayer + i - index) % 2;4 N) [( ^: j8 P
bs[scene][playerIndex] += record;8 x0 ^: H: z! ]9 M% O
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
& m; v- r' y5 {( G/ i* @ if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
- B4 d8 \9 p% ~3 i scene++; |9 A1 I5 w/ S0 |8 n+ Y/ A) U
whichPlayer = scene % 2;
3 R0 G% E7 n( @2 F1 R index = i + 1;
, i9 S+ N8 Y" ]8 ^9 A3 [ g' V; z isWanZhengJu = true;
+ G9 S8 w4 c& m* d7 W! q" H continue;# [6 A+ q @4 E. v
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的; @* h' g; k/ P: _# K
return false;- M, m* Y+ D+ K2 t) {7 |5 F. g. c) V
}
. Q* V& ~9 _6 {* ^+ R5 s4 G } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的% u# r' ]5 [- S# A8 Z
return false;) n9 G/ R5 n' z$ Q
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束+ L% a, }( q( H3 \; o. ~' ^' A
scene++;
0 K& T+ R$ t% c1 f8 r3 G- W- O whichPlayer = scene % 2;
7 U7 ~3 ?( H9 ^4 z! d7 d, F$ v index = i + 1;2 M! s# [+ m( q' [
isWanZhengJu = true;8 B& J- g) N% L5 P: k8 _
continue;7 }6 f2 p) t G
}
) L3 a1 L3 l1 [ if (record == 10 && i != (record.length - 1)) { //下一个数分情况 E T2 v9 u( g) d6 ^2 V# R) \, H
int[][] bsBak = new int[5][2];
1 W" r# ]( j/ J cpy2deepArr(bs, bsBak);
2 n, b0 {+ I C4 r: L if (check(i + 1, scene, playerIndex, record)) {5 @" |) X- t# H( ^" g8 o
cpy2deepArr(bsBak, bs);6 S" T! S0 s! w8 X8 B
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
6 A1 @: Q8 N* y# N/ q3 ` return false;; c- K2 ?8 `5 j' X
}' Z) }7 Q' C6 R8 N4 V! X* g8 a3 w
return numOfAbleJu < 2;; p. E) J: z. ]: q' s! h& Y7 t
} else {
$ H' Y# `8 a h F- ?; i) D! v! E cpy2deepArr(bsBak, bs);0 i) e2 Q: |' G! v
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {' ^4 o, y6 i" S" M
return numOfAbleJu < 2;
* ]/ Q+ F( {) r0 j }# e( b, Q1 v4 V2 U
}6 M: j$ g1 C( a* w+ d5 I
return false;: w% E Z2 U* _- Y
}
" F# _# R( v7 e# x3 I }& @5 m: [9 L+ p5 n1 @; W! h1 k
2 Z9 e& @3 R. {2 m8 ~
if (!isWanZhengJu) {
4 ~' t9 W* F- G$ } ? return false;
' g2 {, e! v' B6 L- P }
8 {- I" |) k1 e- q// //检查是否符合五局三胜
* |, J) X" C# U' ]& c; [+ a// int a = 0, b = 0;
. u& y. M7 M1 \: | m ?// for (int i = 0; i < bs.length; i++) {
/ `% b1 V6 \1 K0 c; U" U3 M// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了* h" k- ^, W- y1 u, F1 J
// break;
) ?& K: \; q) I// }
1 w9 i& F S, J0 o// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
5 E! v' m9 R# @1 X# k/ @" C( m% d1 F( H g// return false;
8 i! ]6 x/ e/ j. Z* s0 f// }
6 g* o7 R% Z" E+ V// if (bs[0] > bs[1]) {
( I1 ]8 b' E+ x8 b5 ]// a++;
. i, |% w: }. h: k4 g4 w' T// } else {
' Q6 D8 s% f: O/ q// b++;: s V' E6 i+ F& `6 |& A
// }
/ Y$ n$ b+ h% E// }
% }& C% W* Y F; }' F7 J+ J( ~// if (a < 3 && b < 3) {//没有一个人得三局,故错误
; S, H8 a1 U* g @5 b" Y// return false;2 H: {3 }4 w& G
// }
0 f- ^" s# E# g //只要有三局及以上正常结果,则可视为OK
6 h3 o7 i/ M! t int count = 0;9 z4 I' e4 @( m* s7 O4 P+ |
for (int i = 0; i < bs.length; i++) {
0 Q+ u/ T9 |4 b$ h+ E& e if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了6 z, B6 q$ d T+ v" x
break;6 J+ Y5 X% H* v
}
, T0 [0 k; m$ I9 N6 h0 E7 y count++;$ F( X0 @, ~* R [! e1 B6 Y
}, p, b6 x- Z# L+ o+ i
if (count < 3) {
+ i7 Z* i' K( C+ ~ return false;
! r) q4 u ]5 d0 e }
- E! I- X" h) T
# H4 _) E9 z2 j, `% W numOfAbleJu += 1;
7 a: e. G2 y. w return true; X8 k. z" z" [& C4 ^, E6 A- W
}. d% u0 p$ J/ V! E5 r# e3 {
private void cpy2deepArr(int[][] src, int[][] dest) {
: j6 X" l+ c4 `0 q1 I7 t8 n; ]/ v for (int i = 0; i < src.length; i++) {, b& p1 Z# G f: |& E4 k
for (int j = 0; j < src.length; j++) {
1 G( L2 K! N' _ dest[j] = src[j];- ~2 W( Y3 Z$ q3 P! F/ Y$ R2 n
}& z: c4 e. E. [0 a) O2 X
}
1 _ o$ m/ U, m: v( x5 `: h }
* z; ]) F# y# e
; n4 G' V4 W; [4 d6 E% v public void printNowCheck() {0 E% K3 [; X: m2 D! v: k' {4 W* G0 b
for (int i = 0; i < bs.length; i++) {+ K; y, l" K W
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了% U" O+ }9 K& u9 U5 z6 a
break;
% l' y; F# T9 y) [ }
' c+ F9 F( M& \ //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出. c( X. [. e6 a- A, W5 c: O
if (bs[0] > bs[1]) {
8 j3 Y- ] H5 f System.out.println(bs[0] + ":" + bs[1]);; F$ u9 o3 S; V
} else {
' M( T5 b; G6 X. `: u+ y System.out.println(bs[1] + ":" + bs[0]);
$ o0 b5 c) b$ N7 N0 R' e5 X }3 U7 [( J% V O. w0 x5 Q* j1 M
}
% @- H# b( ^+ T( a8 E }
2 j1 l* h0 w) U5 E7 T public void resetCheck() {( ^& s6 T. q. E8 M! H" B' D
for (int i = 0; i < bs.length; i++) {! [3 i4 H' i4 A$ T
bs[0] = 0;& m- b* ~+ k, j" t2 T' {
bs[1] = 0; }$ O% y" f2 {$ C
}5 k( \; Z) v- g! H t
}2 Y' P7 x" A4 M3 h( }' D0 B
/**) F4 _ B4 |" q
* @param args
; R, K$ ]8 M5 d7 n */: y8 E2 _0 P- p3 j$ Q; j& K
public static void main(String[] args) {
, h: Q* \$ V5 C. }3 t1 H // TODO Auto-generated method stub- Z5 T2 X+ a( O3 D/ J9 T
GouGouShiJiFen obj = new GouGouShiJiFen();
9 B* k* N9 g8 G" j1 x' ^ int[][] testData = {9 Z$ o# ^! a9 m [3 b/ T0 a# @ S
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
1 j2 Z$ C; X# `) L$ O/ z. I {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},- [) B4 e) v! G
{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}
4 P. V! K1 S" s7 o5 S };
( u1 B! w5 [# d$ p7 q for (int i = 0; i < testData.length; i++) {
) X( ~' `6 }- R1 n. l; ? if (obj.check(0, 0, 0, testData)) {
1 e* I2 I% f: ` Q obj.printNowCheck();" ]4 A0 [+ T* H0 @
} else {) h3 }, l+ R. P1 j; c4 L: w
System.out.println("Unknown");
1 @/ J" ~" u) e9 w0 `+ T }; p# S2 s! i; u' q2 a6 B7 A) [
obj.resetCheck();
0 z; @" E8 I7 `$ C; N! b5 Z5 k }
4 F* O3 ^7 a1 {: C' u7 X }& y) p# J' R0 N! @: [! m
( `. `& L8 e, b6 a% h} |