题目名称:蝈蝈式的记分
0 G4 y' |+ @# R. W8 I9 [- d( d& |8 n+ n, o8 h8 N4 W
内容描述: 4 t' x$ W" L+ Q8 K
$ S- u+ d8 q, J+ G
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 ) F( g- s. L3 r/ ~+ n
+ X: @3 W- y& |' R1 J' _) M因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 $ j& J* f' X9 q& c) v
9 y* o D/ _* j" i- g
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
# j9 t% L! R' N# r4 v9 e% j; ?: s# W' p
输入数据: . C' {+ M5 _; n8 f7 k# K6 i1 \( C
/ o- @0 \! E7 q6 |! O) |- n% Q/ o以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 & h' h; [8 Z, I0 y6 X5 s) R9 H
2 z& H% j1 h0 W L" {
输出数据:
I# m9 C# `( M( W
$ B. c }$ |! q# {2 R/ h% C相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 - ^" E* D; J. o
6 u: t, C# C$ S7 g9 O. K
输入和输出结果数据样例: ( N3 a' A0 L; N
/ ^: H2 l8 t" x5 v) E输入样例
# t3 L# {; J- y! r- x) s1 U% A0 n
& I- d% `6 d0 O2 }. S! ]) {. u) P6 e3
3 R; a7 a; ?4 V1 @* Q$ T+ t D$ A( a4 N
23
; E, D% x7 A2 A& ]5 m9 i# Z' r0 c: @, [! a5 X
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 j9 U# L7 S$ d* ?2 f* f; @
2 V6 U7 T+ ^& b6 }% E) ]7 j3 p& q
25
4 P/ L8 A( B7 i$ _* n! E0 t$ V( F# z: V) S) W7 y/ U8 o$ U
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
2 U0 r; R. P: S: j9 S# @1 s! m0 T) C9 K( a7 @; j! ^
43 # |% |0 D8 K2 o/ t% B0 J# f7 c$ V. ^
) O+ b0 i) Y7 m
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 @" ?: w6 ]7 \2 j7 ~
- @. ]7 u# d* s3 r+ f/ |( I! {2 k3 U5 D
0 Q' j) e0 r+ A" O% u1 ~/ v3 q输出样例
1 l9 T& N3 H! Y
% |6 H( `# C8 \2 G& y# P! c21:17
! I$ J+ W, r5 t4 P$ C
7 x: q0 w9 J# R+ p24:22 0 F9 J/ g. d. u3 _* w# ]# ]. \
. F5 G0 c3 l9 ]$ M. z4 g* G( d21:3
3 q. G: o7 V" F3 t3 T" Z8 n S5 w# U$ k; y+ r$ H) p) X% |
Unknown
+ T9 I% S( b6 e9 B' F k/ h" j; d* Y' G; G5 M
21:14 0 B3 g! Y# b4 W
1 U A% c( ^7 m k20:22 ; g2 w2 U7 y( J$ `( P- j4 I4 q
* v v: v. T8 ] k4 m
21:23
7 B+ N! j3 F7 t; `( x" ?! s2 A& c) ]0 n7 f7 Y1 [
21:16
7 [8 r+ V1 Q: c
- ~* p0 a0 x. c& M21:9
' A. Z- }* D& r
1 \: a6 K9 \5 d' u" ^7 @) B
7 j$ D- f. u! Zexample: public class GouGouShiJiFen {
0 @- O: O0 z: g; C' o
% J" c9 r4 f6 t- |7 m7 \; S public int[][] bs = new int[5][2];//当前可能的比赛结果
8 r$ n: U( N# q7 V// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
P1 b; B; m, x( ?// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份 T7 G% g0 R f5 e# `8 I8 A6 ]5 S6 G
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown, L: H8 a. q& x/ b. W# V
public int numOfAbleJu = 0; //本行比赛可能的结果有几种
) e1 ~" I' H5 [& A/ F5 _+ H
7 ^- X# D% m3 r$ F/ x" R( R /**/ W& y1 ~6 v$ z) ^! K _& v
* @param index 连续得失分的index
; s' W* I3 u# Y) g2 K * @param scene 第几局比赛
) e& Q; g4 |% V2 t * @param whichPlayer index处分为哪个选手得分$ u7 g* W: m {* h6 D5 K' V& j
* @param record GuoGuo记的一行分
" z) Y: ~9 F! W; l; e; F * @return 是否是一种可能的比赛结果
% x/ c) S4 ~3 t8 }- u3 _- D */; J6 ^) h# |7 {
public boolean check(int index, int scene, int whichPlayer, int[] record) {
. {6 T5 |) X" Q b8 r% m int playerIndex = whichPlayer;6 _$ l+ q$ z* w" d
boolean isWanZhengJu = false;/ b3 s+ ?; J8 B6 _6 O$ i$ P9 g( ]
for (int i = index; i < record.length; i++) {
/ ~) u2 G# k! ~* A* p4 V! y isWanZhengJu = false;
5 r9 V2 t3 G- ^ @2 o playerIndex = (whichPlayer + i - index) % 2;
( f# c6 {7 @% k" R; p9 W bs[scene][playerIndex] += record;
/ y3 F" b* a- q if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
0 Z$ V/ G! N# z! ^& x if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束" ]7 t/ o2 D1 n
scene++;
- t; K0 Q5 [( m+ W whichPlayer = scene % 2;7 p! u2 Y0 G: J* C( G" |
index = i + 1;
( u) T6 m* _* w& Y! L isWanZhengJu = true;
9 y, C* ~0 Z5 T( X: H1 ]% ^ continue;
5 \6 v, s) j) ~! e6 j" g } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
, O# V" m4 q i; O: i return false;
2 p& t0 H5 z7 z }& v3 E6 r i2 O3 s1 ^6 y6 l
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
5 e! v3 p6 M- t2 R+ m1 |; F return false;
i7 U! r) H+ \5 h- D+ f } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束5 m3 i) R: P1 y7 c
scene++;
) x \7 t7 k2 O: K6 z! r0 U# D3 m4 u whichPlayer = scene % 2;/ h- P& ]$ G/ O( v5 P. {, P
index = i + 1;4 l% F' I' o& B% q2 Y, A
isWanZhengJu = true;# F- E2 P# y* p& Y' I
continue;( Y) J% C1 j* ]3 A) a
}
3 g [- }2 |/ f( @ if (record == 10 && i != (record.length - 1)) { //下一个数分情况6 }& P( z4 B* R8 S4 w3 i, ^; o
int[][] bsBak = new int[5][2];
4 ?8 Q+ A n- o/ I7 Z cpy2deepArr(bs, bsBak);: f# E9 @9 b6 y$ S
if (check(i + 1, scene, playerIndex, record)) {
; W; p8 B3 k) V+ K6 c) V cpy2deepArr(bsBak, bs);& @$ A, R$ k: h, |5 @2 C3 a) \4 Z! }
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误7 ]' D5 c% R6 e( f
return false;
( C# {0 i$ o# T1 Q% j }8 x: Z$ E9 r. t3 W& I" j( K. W
return numOfAbleJu < 2;0 s. |! u( I6 j6 j2 j: B! }
} else {3 |# x# S, Q5 P- C5 ~
cpy2deepArr(bsBak, bs);
# _% n# x! }3 ^% R5 j, [6 ] if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {. ~9 D% H0 T, `* e6 D
return numOfAbleJu < 2;
( x; { A8 m5 l0 {5 [ }
6 O8 \. E. v9 {6 F, z }
) F) K" c8 R/ Q& f, \1 B3 n return false;
+ r& I& y# |% g; W P5 c6 H }/ h3 E1 j8 D* T0 U: b' d+ r. \
}% ]- e8 `5 J" t% p
' `2 K' \+ u7 W9 J' m if (!isWanZhengJu) {
2 |. [- F9 y8 l* S8 {9 J return false;
! S* x" |4 B2 e8 j9 Q; a" q5 V8 N- T }
, j. q/ F5 [( v, z, D' R2 s// //检查是否符合五局三胜
1 V" F$ S( Q. D% r// int a = 0, b = 0;7 q; X @" H L/ M" X, |
// for (int i = 0; i < bs.length; i++) { p, O7 C/ J& W/ [, l" K' o
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
0 G+ q$ v* t" W8 L// break;6 V" y% c* r% Z" v3 u
// }
0 [' ?$ T+ {0 y0 _/ U// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制9 k+ y/ _$ L+ ?0 o8 U+ P/ Q
// return false;8 \* r+ w% |. D4 N% M* }$ _( H
// }, \; O, M) B. g4 J9 C
// if (bs[0] > bs[1]) {
) ?: \% k2 `! i" u// a++;
( c6 x1 c2 v8 [6 v// } else {
5 y& p7 u/ D- r0 J// b++;3 T/ D: M$ E+ ^8 s
// }
6 a. U8 x2 q# o// }3 R3 t* y- f% c' }! |
// if (a < 3 && b < 3) {//没有一个人得三局,故错误
0 |4 ?8 z! h6 {, V* T R// return false;
. `; |9 X5 k# }// }
+ C* P- [0 d) F //只要有三局及以上正常结果,则可视为OK! I% E7 A8 o, I2 }
int count = 0;
4 `, _! u1 t7 S* y6 r for (int i = 0; i < bs.length; i++) {
7 }. K; E/ R+ h8 j9 S if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了/ L: |* D& _: |3 e! K
break;
- T. u( T/ T! I3 N3 } }/ q/ U. Z: ~* N" p
count++;
3 G# S; }( X- e, ? }
( o7 W# i5 k# r) h# }8 |3 q if (count < 3) {
K. f3 ]( F E) |# s return false;
. U; j- D4 ?3 C7 m }
+ w1 z. r4 R1 y0 N( a
+ |2 q5 g o9 ?! G; o/ o6 ]4 T numOfAbleJu += 1;4 j- _. U) r- m, m3 G( y( R
return true;
1 B6 u8 @+ i# G: S$ u O }) K- E. z& G+ R3 \
private void cpy2deepArr(int[][] src, int[][] dest) {2 h |: w7 K; b, y) ]
for (int i = 0; i < src.length; i++) {
; h! Y9 x$ o& n0 x for (int j = 0; j < src.length; j++) {5 D: v& U* N8 j$ s0 y% ]
dest[j] = src[j];
) e! x) B3 Y; l, E }7 W7 H& v' \0 [. c9 ~/ B, E. M1 n
}
& a: a- O* a* c$ f }' u+ f: i0 {$ r4 Y8 f- l
2 o& a- n; u) T' e' w, E' k public void printNowCheck() {- R, y: b/ N" t1 j- _2 n
for (int i = 0; i < bs.length; i++) {, [* F4 b8 l1 o2 l- E u+ a& S6 r
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
# x j h/ ~0 H4 x8 a5 ]2 F$ @) ] break;
9 `' e* d9 ]6 ] }
- i* ^3 A# [' G6 g5 N //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出" I H" i S7 U( a5 Q; x
if (bs[0] > bs[1]) {4 @7 _) b) q, I
System.out.println(bs[0] + ":" + bs[1]);
4 Y9 D! q5 W, D/ m2 W- g } else {
. s1 B9 L6 Y% Z$ }: y System.out.println(bs[1] + ":" + bs[0]);
$ m0 b. H/ u$ Q5 b" U6 A3 z5 v0 Q }+ p; q7 C2 C) l9 `7 }
}8 ~$ x9 \0 r3 `6 a/ P; M x1 ?# P( L
}
9 J- A: U( f0 c' W' g; q1 O public void resetCheck() {* E( u+ R0 f# ~- j
for (int i = 0; i < bs.length; i++) {
1 l% \8 R! H' g! t1 v+ J, r bs[0] = 0;
U& R: g, [/ N3 U8 b/ f! ? bs[1] = 0;! P6 e K0 k* v" L2 {8 e1 j
}3 e; y. E& x0 \! {( b$ L7 S6 v6 H+ a
}" |* a5 C2 \! [6 K; N5 A' L& E/ K1 l
/**
9 r' d* o: U, Q8 Z3 g6 x7 p1 c; d& i * @param args1 y4 n$ H9 \9 T5 A
*/9 r1 R( F4 h4 q$ ]& ?
public static void main(String[] args) {
3 t+ p& G2 A5 |# J // TODO Auto-generated method stub$ U+ l) m# [" I" F5 e
GouGouShiJiFen obj = new GouGouShiJiFen();
- b- \9 ^! u) B' F- D! a int[][] testData = {
9 G& w# \! c6 M, d2 j5 M: I {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},% g6 b5 I, K0 g2 D9 A5 h
{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},1 Y% A7 u, _! |7 K1 a3 p" g" o
{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}
$ ^3 I) j5 t4 ?4 M& S, z; w$ c. E };
& ?) l) o. r. p J1 M for (int i = 0; i < testData.length; i++) { o- \4 h( J) y6 o; \. G7 O9 r
if (obj.check(0, 0, 0, testData)) {& c2 W. j5 G4 l7 h! ^
obj.printNowCheck();
* L' Z2 I# G8 }2 e. \3 @' O0 }0 i+ M } else {! m9 K# P" J' w3 k4 H: O1 z, h" T4 |
System.out.println("Unknown");
) `: b1 z3 \+ z1 B }
" u4 U/ }5 u A/ T obj.resetCheck();
5 \: U' V; i1 Q1 ~4 N; D, t }* M1 Z+ q) o& i6 a& A
}1 p% U1 q3 n. X, O5 ~% h- o/ ~) D
7 Q9 L% N3 O7 _% I- {' X$ v
} |