题目名称:蝈蝈式的记分
8 K ~+ w1 o3 \. B# j2 m. j) @# }. ]4 R- O6 I8 n
内容描述: 2 b! \$ u, G$ z) n* C
8 B" f Z! j7 M5 [% t7 J
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 0 M3 k' G; S( t, k% a
; _" t; I" ? Y$ p& w; G因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
0 t/ L3 ], L0 R1 f4 v# b; U+ g' Y' W) v4 H
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
7 F( F) M( i+ y- j2 N1 R0 q6 I$ Z3 i* A$ O" j- B! t& l7 k; H) }
输入数据: 8 \( A" R7 V w( C6 I
& K6 s, ?5 X4 {: R% H" u以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
# W: c( }1 p L( w' ]+ _5 {! ~* g0 `# `' c' E4 e: n; F I
输出数据: 2 X( ~' S6 \+ O4 Q" C4 @8 D
* g# N+ P) q; s9 m% U7 U/ x! I) O
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 : D6 L. Y; |, L0 A X- L
# |) d# e1 k* u1 h输入和输出结果数据样例: & a3 w7 ?$ a( H. V
0 t7 E' e! j3 T/ }8 Q; ?# |. I- g7 ?输入样例
2 _$ ]/ [' y1 `0 S
8 y9 x! N$ v) b0 q% y6 g3
: _ n! J- G$ c0 U6 k4 T' N8 ]. V3 P
' Q; R6 E) u: t5 \: o! h23 8 i0 N) \2 @6 G1 e
1 ]9 l- G R2 M; E' m, U8 L" I% ~
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 @* ?& \! H" x+ J: N6 D7 Z
; i1 p' c1 k0 z! m) ?- n25 ( r8 V5 M( ^; ^$ j2 x+ Y, W
+ F9 T* M! N. O
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
! d0 b# [* G( o! d8 q# I T8 Q( ?; P: V; |
43 2 W& q: B r, l, K
# L: W- x' ~7 M+ p. 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
, M* y, w, L' c3 z) _' E
, `" ~( J2 ~% M5 C P, c& N5 f, I; V3 X' }" q
输出样例 8 s# S: c0 x3 l; w' T
# o' m( g7 s9 G4 \- _. I21:17
" Y9 r1 a: Q9 A1 H& i
a Q9 H: \1 h0 d24:22 9 N; Y2 l3 D$ E" d- r3 }
* t% n8 q( E3 t" a21:3
5 E7 }+ Z- K. d& |2 i: U' }6 C0 _( J# N, Q: a+ B9 x. |+ k) K
Unknown
, ^% M$ U& {! L/ U3 E/ ~% K6 m8 Y7 b5 V$ h
21:14
0 t6 p/ a- m, A) z% y' ~; I, G9 u# X& E1 Y7 f$ C5 b8 p
20:22
& l8 E5 n1 M& H+ P& t5 b5 |; \3 s1 l6 X( |1 q
21:23 ! ? h$ r9 v' z7 V0 U8 q% K6 `' j
) ?& S5 @- W' U& `: A
21:16
! G9 l/ y$ V' t, j) p' @
7 K/ U. A& x# `1 M. }21:9 2 ]/ T4 R5 `& Q
# [$ j& T( l# X0 ?" X; ~) n7 y3 }! f8 E) N4 `
example: public class GouGouShiJiFen {, G8 i7 w9 E( H5 y5 v& F
1 h3 } {% S7 t# z! Z public int[][] bs = new int[5][2];//当前可能的比赛结果1 {7 W/ z4 x, ]2 Z+ _
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
* X$ z( {% H: ~' i5 s" Y# P* a// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
& }- Z& m9 N: U# J* M// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
! C7 Y1 _/ h" i# r$ V public int numOfAbleJu = 0; //本行比赛可能的结果有几种; b- J+ w b" d0 c
. M4 T1 A- r ?1 G& T /**
: ]0 j! a2 N6 ]6 [ z: Q: ` * @param index 连续得失分的index4 D% ?& K- J+ q" V. s" E
* @param scene 第几局比赛
0 T/ W1 `" o9 h& Y2 U% k * @param whichPlayer index处分为哪个选手得分. C) \5 v# V! q4 p. C( M, G
* @param record GuoGuo记的一行分. u8 g2 a( _8 e
* @return 是否是一种可能的比赛结果$ q t2 ~1 |9 P" I V
*/+ }$ p" Y9 Q5 n, _0 d
public boolean check(int index, int scene, int whichPlayer, int[] record) {
( {% Q3 e5 \# c! h9 H& Y1 u int playerIndex = whichPlayer;( y1 G3 Q1 X4 v3 a* `
boolean isWanZhengJu = false;
0 [) m6 @" w8 _2 s for (int i = index; i < record.length; i++) {& ]$ r0 F" m1 b% I+ H
isWanZhengJu = false;) }; p, C$ {4 r, q
playerIndex = (whichPlayer + i - index) % 2;
' G/ g) R) k4 v. q bs[scene][playerIndex] += record;
8 ^# ]: I i: Q. p3 ~ n0 K if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
! {5 K( p% {3 r if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
8 W) S) [# _9 w4 p( Y2 k scene++;
8 _1 {2 v) e* ~ whichPlayer = scene % 2;& S. M, T" ]* V% A4 m, ~ C% P
index = i + 1;7 c0 p S8 D/ h6 t4 G, D7 }
isWanZhengJu = true;
. S: _) \& [' A! z, A8 l continue;; Y# d! {' V- n6 h0 |/ \$ S+ q
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
+ d, W" o1 @" t1 v# T return false;
$ D1 P% h4 i1 S; x% z. ^' T. Z }
3 C) x" n1 g% [% T6 L; P } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的! F! W! d x6 B9 g+ X% k7 c1 |
return false;
; E; B- Y$ f; }8 ?3 g* K } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束1 q* {# ~, Z4 A7 ?: Q8 {
scene++;
! I: V: S0 n# A; ~! P: F whichPlayer = scene % 2;: {( ^8 Q' ]8 _; ?0 M1 I S
index = i + 1;
, P4 m% q4 M' F- b: G isWanZhengJu = true;- [0 ?6 \2 ^% l. ]) W8 n
continue;
) M4 h) A g! }+ S& [; i }9 i$ Z" o- c$ L( e6 e
if (record == 10 && i != (record.length - 1)) { //下一个数分情况
& ~2 G7 B( k4 W& g9 R$ S ~* q1 A int[][] bsBak = new int[5][2];/ }" A6 ^! J7 M8 ^* O
cpy2deepArr(bs, bsBak);
+ _7 G. M% O1 S; Z# H if (check(i + 1, scene, playerIndex, record)) {
$ |; @" h! I0 ]& _9 N4 K. Z# i' k cpy2deepArr(bsBak, bs);' A9 d$ V4 {; D% ~& G P* T! B
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
$ z) r9 n( e6 ` return false;
! j8 ^- C* U |3 A5 ? }
& [ K. c! {' N, F: U8 I( G6 d8 i return numOfAbleJu < 2;. |1 j4 U* K) t/ {2 a, I
} else {# B' u8 r+ y& Y4 U; p |( `
cpy2deepArr(bsBak, bs);2 n5 K) ^7 b7 E4 T. J
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
/ E# ] P" f3 C& m. b: W2 W5 _ return numOfAbleJu < 2;
# i' Z J$ t6 w0 S* g6 e4 F a. x }
6 \7 s- `! i5 E# L/ a$ d+ |( r O }0 X# Z+ e8 d5 G5 _
return false;; \, F) r! B+ ~$ }
}- u( c4 l7 P+ u* O
}
' c9 @. n; F# g7 V* _
& I8 O, J; q& @/ ?4 f/ d! g if (!isWanZhengJu) {% t% m5 T9 ~1 v* Y8 A3 C; A h
return false;( m; D. K( m! g& r
}
% D8 d* X- c7 N3 t$ ]6 B& q" P// //检查是否符合五局三胜
% E7 q( F) U- w8 \// int a = 0, b = 0;
$ V/ R, F4 R2 t// for (int i = 0; i < bs.length; i++) {! T* f, N2 t3 K% x+ _
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了' Q# _) g: P$ e* v
// break;
6 M' G' B% u' I0 V+ G7 O7 x// }
6 q" z0 P8 G9 G// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制3 G7 U4 l: `2 y4 t/ l9 r& b; g
// return false;
5 S6 [( d1 k- b- a1 z// }; F" N2 _" L7 _* V2 D
// if (bs[0] > bs[1]) {
' ]; u2 M' ]6 }! B! D// a++;
% `8 }1 y5 G1 _1 T, A// } else {
5 V% @8 q9 e, m( _: q4 N& M' G// b++;
7 ^7 \$ H. K0 r8 W: k// }
+ q7 Z+ E/ I3 X+ n5 ?! \) Y// }% X- j: Z9 x2 f% K. [
// if (a < 3 && b < 3) {//没有一个人得三局,故错误
( x" v1 b# o% S6 x- u// return false;. J% S! P- t! D: L
// }" R- G+ E8 g9 P i+ ^' C. g& X/ f# ^3 b1 ~
//只要有三局及以上正常结果,则可视为OK, v& v; ]7 K3 P5 N0 o- w
int count = 0;
9 u4 T6 V/ {2 {8 c' {" Y1 K; j( S for (int i = 0; i < bs.length; i++) {2 `7 g2 q$ F) X8 s# s. C
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了& {/ f) C; J5 ?5 W& g; {9 E+ a$ y
break;; f5 c7 @7 K/ u3 l' o' z* X2 K
}
9 W+ J0 e8 w/ Z3 T; b/ t0 D' E count++;
^7 P) v, m+ o+ Y0 ~) B }
" @1 Z# U9 o3 {# c) @ if (count < 3) {
* P. Z n' J7 h/ L4 {" ~ return false;
. p) [- c- x* P }% R) J( W4 U- Y F) v( m& m2 d; d
3 y. s$ Y; K" {
numOfAbleJu += 1;
8 c% n! H$ f- {. y e5 f( Y( P return true;6 B L8 y \: `) W# M
}2 M/ [# Y& m0 R3 V+ b0 \
private void cpy2deepArr(int[][] src, int[][] dest) {% H) a$ W( O, _. k3 j1 H
for (int i = 0; i < src.length; i++) {' T- ]6 f1 B7 m$ T& P
for (int j = 0; j < src.length; j++) {4 W7 b) J( W9 p% C
dest[j] = src[j];+ Q9 T5 D1 A9 s/ f: w+ @
} Y: r3 M7 ?9 c( W4 y2 n' a! ?: }
}
: \1 W4 c. N: V, b0 N5 A( X v- k3 B5 d }0 K% ?; K4 n4 E9 V) y6 K
' g4 |' j5 l, k
public void printNowCheck() {+ F5 G; f& E" X& c s# W! c" v/ `
for (int i = 0; i < bs.length; i++) {
: ], q& a$ i E5 {( Q7 U8 _ ~ if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了3 K) ^3 c' x0 u8 F+ R' e# P+ ~
break;
7 Q& n+ K' a# c) o }
! M3 Z7 ]. b$ m" a5 G& n //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
( H) \6 E& N6 e ^0 C' e# ~* N6 e( ^ if (bs[0] > bs[1]) {
1 Y+ D$ i6 }4 I& u; Q, v System.out.println(bs[0] + ":" + bs[1]);1 o d9 n) C6 ^/ I4 [
} else {
5 C! i3 |& m8 _ o! z( b# g System.out.println(bs[1] + ":" + bs[0]);/ g7 g3 \& U+ b
}
1 S" v1 T1 O' s5 t) | }
- H* l3 p; X' B6 t: g. E } m4 r0 a$ m [& n1 U- H
public void resetCheck() {+ U' U$ h) j, l" b! V& S
for (int i = 0; i < bs.length; i++) {
: }* S2 Y4 G* N" l0 A bs[0] = 0;6 r. H9 v$ }# f0 T; G
bs[1] = 0;4 H5 q7 o9 Y- k4 C0 R0 i
}# J6 m, W+ ^; @* B8 Q" q3 l
}
2 e) F. y g' T. F /**
" K* _- F6 C9 O3 F2 R2 C * @param args
+ C, ~3 o% N3 L% Q */2 `7 }* L4 c. V3 x) B
public static void main(String[] args) {) w) [+ U: P5 b0 U) H
// TODO Auto-generated method stub
" _+ x1 q8 l6 p( _9 F3 _# E GouGouShiJiFen obj = new GouGouShiJiFen();
! X4 p! j0 l9 g" D, P% H# | int[][] testData = {7 s' ?& S3 B: p" e5 }5 L, d
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},+ j" B5 j% X3 F1 `8 C! r' 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},
4 q: V- _9 Q0 M8 [9 j" n% n' L {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}) N6 w1 \; j0 D( @2 ^( E+ X6 w
};7 @8 e+ ]; }) O( A
for (int i = 0; i < testData.length; i++) {) O) K3 w6 N7 z1 l. u7 G' y
if (obj.check(0, 0, 0, testData)) {
( m5 }1 g( v0 B. u; e! o3 k: _ obj.printNowCheck();' ], m: n% s( _" f" C
} else {+ `; k' }. N9 B
System.out.println("Unknown");
% @% w; u5 b$ E' w( h, n( Y }/ c3 n( G; v. |% s; p8 G
obj.resetCheck();
' r4 K" e2 I) _% S' j0 L8 d }7 I" S9 `9 W; k8 v8 g( ]7 o9 S5 X
}6 @& W6 r9 d; k
z4 y w* p/ L. z' j& Y
} |