题目名称:蝈蝈式的记分 " m; C: [ s; h3 C
$ V+ @6 L4 T& N, v& f$ H* w$ P内容描述:
9 h: e5 j3 G# ^! w% |) n* s* t7 G N- F8 l! [7 e
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 + p Q5 a: _1 a7 Z5 b) M
* \! ]4 i, }3 e" x) l& J! n. _
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 2 u6 B T. D3 Q s% Q
6 d4 G6 k7 h! j6 }
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 3 y( \% m- W* [* @
' V) d- H3 l$ b输入数据:
- X# y1 V5 v# r% U9 g) }2 S( v
" i2 A( T# P3 {0 J! K4 ]* R以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
! P* y y/ l. h$ W6 B
( c0 t6 D* H; Y4 w输出数据: 1 f- O5 i5 _/ t" O
- c3 D" r! X. q/ H, z6 d4 ?* |
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 ; D% a$ B9 n, d' h% ~
& h1 T' a; Y" m! K2 M/ M+ J
输入和输出结果数据样例:
1 p8 i. _3 x& z
' L7 e9 L3 t8 r. H0 T2 k" n' Z输入样例
4 C& b) B0 \9 g
/ L( A4 A, e! m- F u, Z3 ( x) o/ ^2 U& ~: R
/ g. ?! ^0 r3 Y; |23 3 u8 n1 }; V/ @& b/ g, B q n
# {; F) C( w& g, j% H
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
8 f# r0 q. l2 l) V4 e& T, t! i5 G: _& {% q! [
25
1 ^/ i, v5 O& S
* J" z7 O# ~/ A9 i% F8 P. r+ Y# j# J9 3 8 5 4 8 3 9 8 4 X X X X 2 X X X X 2 8 4 9 2 4
( l) f& } b( z: }
$ L2 R* b L+ j7 @' _/ D: M43 ' V: R3 p- [( X
) y+ j& L: p3 h& {- b
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 C( f! B2 r4 \0 _ 5 W, o: x1 D$ J6 _
5 U3 `3 h k5 {3 l! P1 L
输出样例 ' U% w, t; u) t6 b4 z- }& ?& Q
" V0 K8 `& o$ Z8 I( U& D21:17 : P+ G( {: S& ~7 ~6 N: C' |! X
* ~! b- M/ r* q3 E6 }24:22 6 A7 k6 [# I& p
: s) V) v, R' J21:3 ' B1 M0 q7 z6 I1 \' @3 C; X) t
& i' V- q. Q3 M2 i; V [" V9 rUnknown $ V! w0 E% P- Y4 B2 D
) u' V4 w3 z$ i3 c; I21:14 1 p& w7 P, L' P6 C% S* R$ g
& ^% d$ J, M$ Z. i A6 N/ h7 C7 F9 {! d20:22
- r& U* C8 j9 @
5 z$ L9 P6 w' `" f" H+ K21:23 8 _( j; U O6 F: R2 Q
: K: W7 c6 i: `. _, T! u21:16 : h4 k. n8 \1 B6 P8 g7 }
" p) j1 z; v( F21:9
% g, M: {6 m3 W% Q0 Z/ F+ n# ^
% V' ]2 U) o% }4 e; Y1 N! F- p' \! D" B
example: public class GouGouShiJiFen {
- U4 d& s; r i
# ~: G' F% `2 c9 s$ W public int[][] bs = new int[5][2];//当前可能的比赛结果' \+ X0 L# d6 O' Y- N8 {
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
6 T1 q0 A& ~3 S4 {) P5 R// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
/ @9 T) h/ E6 c& ?! k) C// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
, K& ^! u# K0 A) @ public int numOfAbleJu = 0; //本行比赛可能的结果有几种
& M+ U1 R+ P5 b V- b: ?6 g
% V: B& p3 F- ~! Z, t* P /**3 g1 {; e0 _6 o% y3 @
* @param index 连续得失分的index* f- m6 h& b3 f5 ]- G
* @param scene 第几局比赛
9 h( [ P* m3 f0 G% j5 o, E * @param whichPlayer index处分为哪个选手得分% z; H! \2 u. v T
* @param record GuoGuo记的一行分' c$ F: a2 C' l5 u& n( l
* @return 是否是一种可能的比赛结果- R Z9 z, t w! ]* [! j* g
*/; f/ P: x2 `, Q5 g; q$ \8 F
public boolean check(int index, int scene, int whichPlayer, int[] record) {
3 ?7 X' |# S# c: n- M; }1 R5 E int playerIndex = whichPlayer;
j0 I6 t* B0 `2 Z" H boolean isWanZhengJu = false;3 e3 \9 ]6 I9 Z& J3 D3 h! y% z
for (int i = index; i < record.length; i++) {0 I6 U+ S% D l& x% e
isWanZhengJu = false;
B; T2 \; e/ ^ i- g! @9 D playerIndex = (whichPlayer + i - index) % 2;0 T$ @" y8 Y2 h$ r, c
bs[scene][playerIndex] += record;
9 V# l3 w# ^; |' W. W+ w if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
' w' x- |8 d- w' I* W5 I if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束3 Z$ P0 |# [& v1 f) b
scene++;
. Z( T8 m. k V. V whichPlayer = scene % 2;
, R6 a- ~1 K. P# `4 t, _ index = i + 1;- Q6 w; L+ f$ B. K
isWanZhengJu = true;
+ x0 y p) k7 w! c" h0 ` continue;
% I6 A" J7 a5 d2 \9 m+ C ~* N } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
! Y6 V9 B# t% Q* Q0 j8 j return false;1 K4 K% _$ T0 Y1 P
}
' Q, R2 P/ U' X. S, R0 a } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的, r6 I% Q, s. F4 s% _" y
return false;
* Z9 ~+ x, E1 U* H } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束4 S0 L- I: s4 I' r0 E
scene++;* e; f- J# @8 a
whichPlayer = scene % 2;
$ z6 K4 j* H5 ] index = i + 1;
9 e! B5 t6 I5 @" e3 m! X6 a isWanZhengJu = true;
! n1 g, a! q% X+ M: S1 ^+ t continue;
2 f A$ |4 @! ?0 ?" q* X }' d8 W, j. M0 Q# m
if (record == 10 && i != (record.length - 1)) { //下一个数分情况
7 K- M3 ?. g- a# V8 p$ }( l3 e/ C int[][] bsBak = new int[5][2];# h. Y( A0 t( p# [: f! ^. C# n
cpy2deepArr(bs, bsBak);
F) c2 B0 B' k' n( l if (check(i + 1, scene, playerIndex, record)) {6 R' @: e+ H( S/ n) X1 z
cpy2deepArr(bsBak, bs);/ A$ a! F9 Z# E( c, v$ ]+ m
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
9 _8 X! N+ J, |. x3 b& [ return false;
( Y o! {( Z" E; d& z+ t9 ]) t }
4 T0 T& Y/ a7 s1 E return numOfAbleJu < 2;$ i( S! Z" h; D; N
} else {
, O) @" G6 ~4 u: { cpy2deepArr(bsBak, bs);9 `# o, j! K7 J0 l4 z
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {2 l! P1 S$ J6 [
return numOfAbleJu < 2;1 v9 W+ J1 }. F
}
0 X9 q/ o5 B5 N7 k+ f5 g }
: B0 c2 v1 [/ T) m' R return false;
4 G m6 K) Z' S/ b: k! { e }; V3 x8 X- d# m) w+ A3 d
}0 }; E* g; S% h5 [
0 ] e; D/ W$ g" V
if (!isWanZhengJu) {- K, d; U) ^' p1 A- _
return false;
3 l1 p l2 N! { }
2 p* G: Y+ T/ A. L$ n2 S- d7 M// //检查是否符合五局三胜 k! e: H4 g1 N% W7 c
// int a = 0, b = 0;7 A( ]( F8 }0 M% T2 B8 x" T! ?5 T
// for (int i = 0; i < bs.length; i++) {
/ b- `) _% r; q. k, ]// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
& | x4 {+ Q! I/ j6 L4 P; c// break;; x2 Y7 g( ` q2 Y* K4 o
// }
: ?0 Q( s! [& e- G8 L( }1 u# D// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制- }5 e9 {( h% s% @( Q
// return false;/ c- W7 b9 e& K9 {) H
// } a9 {" O6 O6 ]
// if (bs[0] > bs[1]) {) {$ R9 k! H! l- k! t3 z
// a++;
f, n5 B# Q# G% l: H3 S// } else {5 V1 L, J/ a: i+ {5 Y
// b++;
' w. }7 C# B. Y* m) ?& R8 s// }
1 @7 {" |1 x7 K( r" n// }
/ K% W/ P8 b( d: T% I9 w// if (a < 3 && b < 3) {//没有一个人得三局,故错误
" `$ O0 D! ]" V; K4 j7 K$ \/ l// return false;8 d) ?+ G! Y! E! J
// }7 z2 r6 t2 b- n& _5 E
//只要有三局及以上正常结果,则可视为OK
# B$ x- I8 T, ]( p# a7 A" J$ c1 P0 B& f int count = 0;6 O$ G, B% C. A5 A1 L+ u1 w
for (int i = 0; i < bs.length; i++) {, s* I+ O& E1 ^2 f. ~) ]3 z' v
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了- B4 I/ a. D6 w
break;+ O7 p4 l; E/ ~+ e2 ^
}
$ o+ L( D7 O1 _- d8 ]5 }% f! d0 c count++;
8 l! ?. \9 T! Y }5 H5 R Y0 p7 }/ f( t( ~3 ]9 l( K
if (count < 3) { d: T/ u2 A- A2 I+ d
return false;7 p7 F# A4 M# Z8 K6 |% r
}
' A# h3 p2 S/ ~& e
* F' W: i9 [2 ^( H: }5 b6 A numOfAbleJu += 1;
5 h+ J# o' R: H( ^ return true;
9 n% c5 A1 D5 y* O6 V) |! {1 A }
7 a7 c! E0 g7 F$ l7 l private void cpy2deepArr(int[][] src, int[][] dest) {- m! E$ @ D% @" N
for (int i = 0; i < src.length; i++) {
* ~7 M: o2 P( T( R5 [2 J: C: g for (int j = 0; j < src.length; j++) {
$ P9 I, k' \1 C: \: _+ l& d dest[j] = src[j]; ~2 {. A9 y0 u4 k% D2 N3 O3 g
}
0 G- R1 s: e S2 n$ L5 Q# H0 v; _( I }+ E8 e( [, _ t6 x- D
}9 q$ h+ I5 V' r6 h# [+ @
; w; ~5 S* c1 c
public void printNowCheck() {( N( G9 @: \' O( e- e: ~
for (int i = 0; i < bs.length; i++) {" I, E2 k6 p( T' x
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
- w- d8 J: I9 [* a( D; j break;
# m* @0 l( X; v; m! N }
8 }( K5 a% E4 e$ K \. L7 H) u+ w. \ //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出6 u; \ W/ D; H1 s% C
if (bs[0] > bs[1]) {# t, @/ y6 Q2 R: C( J
System.out.println(bs[0] + ":" + bs[1]);
/ I# D* N: G) j } else {
5 `2 p0 j n4 C6 L3 ^ System.out.println(bs[1] + ":" + bs[0]);
J" v( g4 ` Q2 l }* j: h! {3 i8 }! w
}
; p9 X+ S1 _$ I2 v; ]5 n9 T& x; x& ` }! G# y; V; X1 _" D9 w
public void resetCheck() {
/ B' H9 x3 n& E$ k1 g for (int i = 0; i < bs.length; i++) {
7 ?3 |: z4 v* N" N6 C g9 S5 C& A bs[0] = 0;4 y( v% h/ N" B, V' F+ Q
bs[1] = 0; q4 F! e+ c0 W+ ]8 x
}! Z: P% t4 D0 g% g& g% ]
}
- @2 s% H" y1 |! ?" q /**& E0 O) V2 F# [7 h2 y3 h
* @param args4 ~* [2 x( d4 R" M' Q2 g
*/1 [5 s3 R2 c4 g+ v- Z6 P
public static void main(String[] args) {
( a9 G. @) D+ r/ H- m F // TODO Auto-generated method stub
6 Q! Z/ A+ f/ w GouGouShiJiFen obj = new GouGouShiJiFen();* x% x8 U4 h. A, T+ Y
int[][] testData = {
5 E2 J3 g" x- @ {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},! `" ^6 d; I. ?) 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},
9 f( l0 M0 Z7 _3 A9 ~ {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}
9 [+ z( c4 N' ` };
5 E7 i5 g' t4 [ for (int i = 0; i < testData.length; i++) {* y% L! n" K, j: G5 ]3 n. R
if (obj.check(0, 0, 0, testData)) {
. K1 |) H5 q) e- {4 X- V# a obj.printNowCheck();- l {1 |" ]0 d |: |
} else {
# k7 h. p* H/ g0 h/ o; _ System.out.println("Unknown");
. }3 c& t& q5 T& p+ E- l. _ }
8 S# y0 ~- F" }3 O7 ~ obj.resetCheck();9 s. O0 H( b7 u; y+ O( X
}
' Q6 ^. u7 M) d# t }7 x* f7 d1 x. e& F2 y
! s+ O- s( R$ L$ P) c4 @4 x} |