题目名称:蝈蝈式的记分
+ ]7 G* J5 z4 c- {/ H8 H% F2 g1 T" y/ {. _
内容描述: 5 G; N. A) L9 E
, C% C2 y- `$ \
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
* ]6 x& R& R( v1 |' b& L$ i( V( E9 Z5 j- C: o- F
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 n* c8 v: T/ X7 S6 [9 y! n
& D; Y1 M7 T; _6 \. J6 P需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 4 r. w3 I3 J8 ]
; I- ~' B: W3 y m
输入数据:
" k2 N% X3 g- G0 l6 m1 c A3 m" h$ O( V2 ?
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 4 x A9 q% b6 x1 f) c
0 x" A' p. U- Q0 P. D( p C输出数据: ( h& R6 C( ^& g) h7 n# c: Y
. r7 P3 B; d$ ?8 T, O& F
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 8 r1 e: ]0 x9 P
4 r) d! S& N7 C, \; |' L
输入和输出结果数据样例: 7 e: v& m) M" {+ n' P0 q% ]: z
7 T5 U! J& M, `& k
输入样例 7 @3 g% F5 L4 U7 N/ ?) X' b- p
2 \+ C/ s& c/ O9 F/ U3 & |! j3 J p$ ], ?0 W$ B5 s! G
8 J, X0 M" |$ U: {2 c23 " R; _+ \6 q! G6 e5 @" a* s9 E0 ~
! r) T; ?" \- A- E2 ?8 V
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 1 d6 S" k$ b! N7 q+ |- l6 C9 b
$ k/ a1 O" d$ y- V1 d( Z: _6 k25 % y! F' w4 n& u6 @: W- b
; P! H1 s7 k5 T* G7 r
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 - s' q+ T3 I' P6 I# ^( i8 L+ G
7 i) z, c {& z8 U+ {
43
# i; Q8 B: D5 W' q M1 ]: r$ d1 E2 i! ]! {! ?
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 e2 f8 l4 t1 u8 T- `. X
6 [% |5 z% y9 V5 Q% F) C% T# A" d
7 u1 T7 ]7 b4 x( u1 w; _输出样例
; S& P$ W0 M. t6 b" }5 i6 b( S( C9 o' ~: k- M
21:17
2 |8 V- C! ~1 n, i, Z, R
3 ^( ~* {% j! L0 D0 J! \24:22
2 z5 d* a. [) c- Q& V3 Q. d: g- f* u& X! n
21:3
/ F3 N% o/ \6 O: q) z
9 d; I- O. y! n# J: H! \Unknown
% q3 ^! b0 D# a- d$ @& c7 I P6 m% Q4 g9 k
21:14
$ ]* Z! T* i, j3 f* H$ ]5 B, ~+ U! v: p- I
20:22 2 R6 ]6 ?% u8 l/ \% s
; r6 K6 {! \, ?; G* T
21:23
5 L6 e/ ]0 n2 B+ S7 O5 e% [: V$ A) a t; N8 U# X/ E
21:16
& u0 L5 L/ \1 p o% r0 o1 k
/ k1 U6 u$ J) P& J2 v21:9
8 d& ~7 q5 A# c1 {# Q. U) E
. V/ c6 N) j8 l& w
* G4 D, m8 y% o+ c- \. hexample: public class GouGouShiJiFen {
% C/ L: e _/ g: C) [# T4 \, w6 M1 `$ |+ M( b, H/ p
public int[][] bs = new int[5][2];//当前可能的比赛结果
3 d9 `6 W" R4 S' l// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果! n0 w0 D6 ^# \8 _. G
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
8 W* h7 x4 h( ]( W" z2 x: j/ s// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
/ h( p' {* w8 [( A+ a) p { public int numOfAbleJu = 0; //本行比赛可能的结果有几种
& g. g6 l) h! P/ y7 t4 i1 g9 P
% m* l- s" D, ?. R /**
4 h# N" H) `; N: Y( t0 E* z* s. Q& D * @param index 连续得失分的index
% H6 K5 S, |/ N* k7 Z4 r& G * @param scene 第几局比赛* T9 t' y( n4 ?$ v- L) G# S- M
* @param whichPlayer index处分为哪个选手得分' \# T9 U- y$ N; |
* @param record GuoGuo记的一行分
! H! A0 F) J: O- N * @return 是否是一种可能的比赛结果/ d2 L; a- a1 X( [& q+ `1 b2 U
*/
3 K3 o" `& d* k8 T/ u public boolean check(int index, int scene, int whichPlayer, int[] record) {
6 R: X& U( J8 ?& A1 U8 z; j int playerIndex = whichPlayer;
* z6 x8 O' O) S2 v% c* Z/ b+ y boolean isWanZhengJu = false;0 y; h8 c; Y$ d' Y% G
for (int i = index; i < record.length; i++) {. i" x- ~ i3 T8 q
isWanZhengJu = false;
]) H! H6 w3 M. @$ ] playerIndex = (whichPlayer + i - index) % 2;
3 T" B. F: w3 M% K7 m- F bs[scene][playerIndex] += record;! }$ X+ X2 B z. g8 Y
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局/ e6 A9 p9 e i% d% C
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
4 u$ I5 j7 b; X0 x r scene++;0 m! z* \7 |8 o3 n* D' V
whichPlayer = scene % 2;
! {2 m; I/ p6 E$ e) l# `, Z index = i + 1;( t4 i7 m: c+ A5 j
isWanZhengJu = true;: o6 ?9 C+ Z5 ]8 Z7 O) J& {
continue;5 P, q Z2 G( j" j
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的, s) ?# C+ X6 v' m1 F
return false;
( m: U+ A6 Z. S# {: s }) S- m9 v! x) Q" V
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的9 w% Z/ Z; M" ] Q7 ~# G! V2 k
return false;* z+ [, Z5 V' H3 F
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束# n& j, }( r! p8 ~; G% q
scene++;
6 K8 A$ D4 h) T4 w whichPlayer = scene % 2;
6 Z7 e# X6 ]% S6 x! [ index = i + 1;
! ~: x8 R. d9 K1 ^5 d* z3 i$ [- R6 t isWanZhengJu = true;
8 j: Z4 H P: h0 v continue;+ ]' ~( u2 f y; w* V2 W5 I0 t
}
3 i* [3 G% S( a! l. ` | if (record == 10 && i != (record.length - 1)) { //下一个数分情况7 C0 S) }& O5 A- U
int[][] bsBak = new int[5][2];
/ {( Q! y3 r( W/ T! @ cpy2deepArr(bs, bsBak);# a8 x. p/ e2 U8 K; l: V
if (check(i + 1, scene, playerIndex, record)) {
. y& n( }& a: o; l+ f9 e cpy2deepArr(bsBak, bs);0 _( E, G: S! O5 f
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
: ~: Q. S7 p8 R5 N: V- v return false;
% c' q0 G6 F. b% W/ r+ x }% s: }1 j9 X" p7 N) L! ]4 W+ e
return numOfAbleJu < 2;& ]6 c9 Y& e4 h2 { ^* ?' D
} else {
* R) h4 J4 D% ^/ H/ x0 Q3 o cpy2deepArr(bsBak, bs);, O* o9 y6 Z: j6 x
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
3 t! H. ~. Q. r" h: u* Z8 w return numOfAbleJu < 2;& f% M! D# Q/ r- V( {# r6 X. U L
}
% e6 B! g4 ^1 _' k0 P: T9 X }! I" ]5 @9 a0 S/ K; C! C2 @
return false;
. |% h' h/ Z- p, i5 q }( d, K. {4 l/ f0 j- x$ ]/ U8 M
} ?9 S1 ?, R8 {8 o+ O9 x7 H/ F+ U" `
8 _7 c& D- Z2 j
if (!isWanZhengJu) {
+ @; T0 P# s7 p+ d/ D& ] return false;
C: B: s/ c! z( o- h: W! K) I7 C }& }5 Q- P( J" g+ u/ L
// //检查是否符合五局三胜
! `$ I% l# T# Y. h# K$ @0 Y// int a = 0, b = 0;
/ D& S# q H& o6 D& C8 y) Z// for (int i = 0; i < bs.length; i++) {* E/ h( L: J* ~# \7 t
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
8 @" d4 q4 p+ ` [// break;: v; w; N K7 F+ c9 o6 B
// }: G( X. S. m2 Y' \
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
2 X6 I1 m" N0 E// return false;
' r- @! J' @: J7 Z {// }# k' I" P* Q; ^& g1 H* |/ P, G
// if (bs[0] > bs[1]) {( a/ N" Z$ u- l, N* N* O
// a++;. M9 l# {1 d3 H. l7 P7 |9 g6 A1 E
// } else {
4 L) G8 ]3 `2 F! E( r5 H2 q// b++;
$ ~. s! s9 |" `$ R$ z" B* m, ?// } j' f7 ~1 q. z# m9 u3 z( A5 W
// }
9 O# c! m& z" M' l' O V! n7 ]3 d// if (a < 3 && b < 3) {//没有一个人得三局,故错误( }) B- C* b7 S% [, y8 h# _0 \
// return false;
/ h0 g+ }) U4 J. S* g) P e// }5 r, Y6 k2 O* G
//只要有三局及以上正常结果,则可视为OK" e* X& U9 Y( Y" t1 K
int count = 0;
8 l& m' z. X$ r2 W6 a1 \ for (int i = 0; i < bs.length; i++) {
9 k l. w3 O% z0 M b( ] if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
6 E) H0 a% P K; R- D* ]% T break;
: W5 |4 V2 S4 z3 N* O+ u, h6 Y }
0 f* n4 b- F6 v: g6 A. Y count++;
# q8 }' i0 r3 J* M \ }
4 R' T$ @2 x0 m1 b Y( ?6 s if (count < 3) {- c9 o4 t: F& M$ |! a a' }1 K a, c
return false;/ h" \& T) y4 m" [" |( j
}- i% P) V" t$ _& v! _+ W
5 p( Q$ D8 C( [ numOfAbleJu += 1;
5 X$ w2 W+ h+ z! T, @ return true;
& n" n$ P# B b0 t! { }
' a* M5 o- Y0 L$ L$ l- O7 ]0 D private void cpy2deepArr(int[][] src, int[][] dest) {* m4 S$ |& X R+ N
for (int i = 0; i < src.length; i++) {7 N$ ~- F. w5 F5 ^% U$ j; a" W
for (int j = 0; j < src.length; j++) {" _) i, B; ^( e- D2 n
dest[j] = src[j];2 L y! v. P5 k4 R9 t/ w+ N: \
}
- p2 H& [& x; Q/ r3 b0 d }
- a; c! g' o6 v" D, g/ R }+ N& w/ t; {' H/ T: j1 U
W: K2 t3 S N public void printNowCheck() {4 H& N" {8 I2 B N" ^+ I
for (int i = 0; i < bs.length; i++) {
6 B3 G& x" ~7 d1 d' C( y if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了0 ~& |0 W9 b( G0 N' k# K8 h, b
break;
9 P- u) c( n" w R' w }
, j( M5 ^# q2 @+ b, X //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
, H9 W3 ~5 S1 H2 R4 G3 Q1 ` if (bs[0] > bs[1]) {" j. `. G( B8 t. g+ B( ?
System.out.println(bs[0] + ":" + bs[1]);) M8 }+ B' h7 b5 S. b8 f
} else {
: u% s& u! I+ z; N V System.out.println(bs[1] + ":" + bs[0]);; m/ e9 f2 T. E" r6 A$ f6 L$ K7 ?/ _
}
, s+ R7 K# G0 m& ] }& ]6 [6 d, w0 j l4 `
}& p, F1 P( v/ i: T$ A
public void resetCheck() {# x' f6 ^6 B& V9 O' q2 F
for (int i = 0; i < bs.length; i++) {
. O% z5 V7 e1 K2 ]4 ~1 k bs[0] = 0;% V7 c: |3 X% `
bs[1] = 0;5 k# h9 F. S* H% I5 Y. m- e- u- I
}0 A) P M; k% M- n/ _* ~* a
}/ V& ?- D( n& S( X" ]+ O& F
/**
- Q( P) T6 {9 b: S8 _9 N" d * @param args1 r @) U! K" D2 g$ [ x& B, A
*/! O/ ~* y b& Y( D" u
public static void main(String[] args) {
8 \8 H) V; {! w% N // TODO Auto-generated method stub
& U7 R% \2 I4 Y' b0 f; | GouGouShiJiFen obj = new GouGouShiJiFen();$ q" b& V% j8 w$ H+ C) |& p9 a- B
int[][] testData = {# r! {1 R, J: j7 |0 P
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
' r$ I. z2 w1 g2 |1 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},
4 a6 R, x2 D$ V& D& L# ?: y {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}/ k3 n- j( w7 k$ K r' K
};( i8 g6 g0 R- }$ ~! i& |
for (int i = 0; i < testData.length; i++) {
& C% u9 w3 Z R8 j! |" @: i if (obj.check(0, 0, 0, testData)) {0 D# r) ^$ V, h
obj.printNowCheck();. b- z a Z) M. b$ c# Z
} else {: Z/ ~6 t- {" f
System.out.println("Unknown");
( q; K( Z' s* V4 S% D2 m0 ?7 J }
# j7 Q/ z7 u( S0 d7 w4 E obj.resetCheck();
2 B1 j2 e, l( H8 t8 ?/ C+ y }1 u# ^1 T+ E7 d& `3 W# `: F; x
}
, A. C+ y, Q- ?3 ]! J
* _6 `4 t# l; o) ]} |