题目名称:蝈蝈式的记分
% K) w- \' Y K! v
9 `7 C' z$ O) t3 F0 C4 T6 N内容描述:
F/ I: G- P/ D
% X, A: C( Y6 f! R. B' [2 C蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
\ F# n# Z3 R' i7 F+ X" B9 r- ^( O( A3 h
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 ) m# J% Z0 k$ d6 g/ d- w
% N2 p% Z( N, C* p
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 " S: i$ s6 `/ i: |$ a. `
- l' d3 `6 r" x# e5 T6 W6 y
输入数据: 2 I; ]! J. x" {5 j/ n; P
" R' m5 F6 \9 g" L8 e9 x& [2 b以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
1 D. u; a" a' i: ?2 ~( `
1 l1 V8 a! r: W/ ~' J1 ^输出数据:
" b% w! b; {0 }. D P
* x$ ^- S6 s# u# ?0 a* W相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
/ q4 V% T1 M1 D' O7 h7 Q$ L5 M6 e7 ^6 n' a9 A: Z/ D
输入和输出结果数据样例:
2 }. ]- G j' T% b
. H4 M' J& L( H1 \1 V$ |7 k输入样例 & ^; i& [7 N, _, G1 H( E
2 k# w' \4 b& N9 B+ t3 / {3 r) m5 j' Y% p/ {( I
- {6 w2 A4 N) L. ?' q
23 9 `$ y W4 a' q( w( ^6 [
! ` f9 n7 |. W7 ?' z# p ]! H9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 - p( H/ a" E" Z. K# H
, m; o1 _2 K0 ?/ \7 ?25
! M6 H* [9 ?8 ?- B4 Q/ s& n" L/ M3 c1 v# G' E
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
1 g/ t+ d, i9 p5 s% f: J
! t+ M+ m4 u2 O8 L5 d- I" @43
' r# y6 M8 D& Y
9 c7 G6 m1 U* y5 F2 F7 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 5 V. h1 |. v9 f
: u( o; A# n! [& s9 [7 S4 J
8 f2 r+ R2 h, f: L4 q
输出样例
. ?) i( u M# G L- W* C/ f. I* i+ R+ `
21:17 0 G M C6 E% p- L
* e g" ]- K u& l
24:22 , ^9 u% o& T0 g5 M
4 ~7 W k2 w0 O) l$ O% p
21:3
/ [ G6 b0 P% H& r+ ~/ Y" ?9 ]& k: c( l9 m( F8 d* D$ J' b& N4 h. |
Unknown ' m. j5 @+ C0 y% [* o
5 Q I/ a9 {6 y; {3 I% O21:14
: F" K9 P1 f; v0 E. z& \3 f( {) N1 f% ~$ G( S6 H
20:22
( c* b( v/ [+ u( T) r
, t. }- t& _( d# a5 f7 |, W8 W21:23 : @ Q g# P) L) e, `; H
1 C: O. i, s, ]21:16 1 }& Z! ~1 u0 q
! b7 r7 v B# k/ s; ~
21:9
/ L" a W' z* g: A / E& W2 O! t/ V( w
' E9 s: C3 u$ s e0 Z1 Eexample: public class GouGouShiJiFen {
. R2 Q7 _3 M0 r
& U( }' J, O+ D5 N4 D/ x public int[][] bs = new int[5][2];//当前可能的比赛结果
5 ?2 f u3 |: S) j+ P: C// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果8 O, q9 [# Q& H0 h" k
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
8 M6 Y8 v* a$ j; X6 d4 J// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown5 l: g, S- B! Q: d5 P
public int numOfAbleJu = 0; //本行比赛可能的结果有几种
s+ f3 F0 Z9 t9 T" } _$ F 2 v' o$ U0 t5 I- L& E2 ^
/**
8 W7 B5 ?! D5 C i3 J2 T * @param index 连续得失分的index
- x2 L4 L& }5 T * @param scene 第几局比赛* H. M8 L1 ^, y0 r) M" c7 R s
* @param whichPlayer index处分为哪个选手得分
4 a+ q% D7 ^+ | * @param record GuoGuo记的一行分
9 C# o( F% w% S% q+ ~) U * @return 是否是一种可能的比赛结果
* }. l$ s" M+ X$ C */: d) O3 f; D, F: I7 g0 M
public boolean check(int index, int scene, int whichPlayer, int[] record) {! M/ f) m7 r% c! m
int playerIndex = whichPlayer;
V4 p. X9 K; n3 y boolean isWanZhengJu = false;2 A- D5 s6 z4 W
for (int i = index; i < record.length; i++) {+ V0 D. A0 r( A* Q3 W
isWanZhengJu = false;- d- l. _9 w1 _2 y) J
playerIndex = (whichPlayer + i - index) % 2;
* z* X0 q) U" K. H% O% C bs[scene][playerIndex] += record;
2 u$ a! w j( ^! B) m: A: ], p( C if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
6 o, E) H! w- { if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
T0 C7 X9 f6 h& c) D. z scene++;$ ]) D& R% w/ W8 b4 l" m
whichPlayer = scene % 2;
0 \$ k' A2 W; A8 L2 ]- h' P& G) f index = i + 1;, d6 c) `: a8 j8 R
isWanZhengJu = true;
" d0 m; r/ H4 @3 S+ m. e continue;
/ r' T5 r2 F9 v5 I } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
' g0 i L6 `, w: L+ i4 t8 |8 e2 G return false;
9 o6 H9 P8 R0 w- J: Q) W }
7 _7 O$ Q7 C2 ^% w9 I* m } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的9 q& Q4 @: B- A; u
return false;1 x+ u# Y4 O) F+ c
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束+ O* z1 h% K( B; o! i
scene++;3 G/ @& z: q& D! C. {
whichPlayer = scene % 2;
2 C- R' L( t$ p8 D" X8 `7 a! U% s; \ index = i + 1;+ @ N. x, M# J: o2 y, p
isWanZhengJu = true;: y( p& m; S5 ]8 z+ a+ F* e
continue;
5 ~/ j/ R7 C, r } g7 \1 @* h }
! p3 @3 h3 }! E if (record == 10 && i != (record.length - 1)) { //下一个数分情况
! c* Z; J& u' S. f& j int[][] bsBak = new int[5][2];
$ n# k* v. x' e3 v cpy2deepArr(bs, bsBak);
" V4 h1 P7 E8 X if (check(i + 1, scene, playerIndex, record)) {$ D1 y" s. ?1 d& ~' C9 U
cpy2deepArr(bsBak, bs); ^, C9 i0 u7 T" r" H9 I
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
8 E0 K; X$ j- {2 R4 P6 s- W return false;
+ m. r9 L( J# \ }
3 w$ Y) V ?& L0 S9 ? return numOfAbleJu < 2;) X3 D/ X/ B$ @! J& [( s
} else {
) x+ c+ L- a9 Y" ~, I) } cpy2deepArr(bsBak, bs);$ l0 c. J+ L2 k+ b' h
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {# k! N4 S+ p, n A4 z) R3 ]
return numOfAbleJu < 2;! X5 g! c4 Z8 f6 @! w: H- W" I
}, i h2 A* l# c' E0 a
}0 S4 y9 R/ g6 `" f
return false;
1 q3 d( K- v3 F' a; \5 |( d4 R }+ R9 ^+ E2 m! {. i& T# V. X
}+ U/ t; S+ V- h
, w, x9 o, C& i8 t) T4 r2 a( Z: Z) O
if (!isWanZhengJu) {
9 @: `- W' G$ a: l( t return false;' u1 u- q" _3 P' Q4 P/ b& ?
}* E% t% j5 `& c7 S0 e$ [$ `
// //检查是否符合五局三胜3 y6 T% n2 I* [; L4 P
// int a = 0, b = 0; t# H: u2 d/ M
// for (int i = 0; i < bs.length; i++) {
( `' X8 S- z6 l: K7 V// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了+ j& p, M( \$ `5 `" T
// break;
, f3 Y) _# a: Z1 H& Q L4 W// }# H0 }. t# r+ y3 g9 R. R! _# Y
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制( X; r* Z' ]9 M, l3 }7 @
// return false;
: \0 J \; C4 F6 q4 v# d// }
5 R6 [! n- ^# u9 |+ ~/ M1 I// if (bs[0] > bs[1]) {
) R4 `4 @1 y$ S0 h9 L// a++;
" ^6 m9 z9 V8 F' d& Q8 h' D2 p// } else {. m3 T, d/ \5 {! U- w% D
// b++; }. m! c; o4 X8 k \
// }
2 h+ \6 g- z, C3 b/ ^4 l// }
% \+ }( t. r* [& D// if (a < 3 && b < 3) {//没有一个人得三局,故错误
3 S9 t1 q4 \, i F// return false;
8 [4 X! M: i9 M8 r// }% P6 d7 k& ^- N0 T6 o! v4 p
//只要有三局及以上正常结果,则可视为OK0 t. K8 L, z3 y! v; H2 a
int count = 0;
6 r& I6 M, s) j' g2 I; w for (int i = 0; i < bs.length; i++) {
. y7 N: z; Q$ j+ z$ n if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
4 f# d4 `7 i0 P- b) O break;
1 ? N" a9 E, P }; T, {5 R6 K2 z" [3 p
count++;2 m6 c: C v8 V% e0 }
}
# ^$ w" ]# f, e; t8 d4 a if (count < 3) {
* m; E9 }3 p7 g$ i/ ] return false;
. q" Q: ~( v0 E1 f$ a2 Y& A7 I, b }
/ I! J; x+ C m- z8 d# v& |
* x) o, ] P( O1 d2 o8 {) j numOfAbleJu += 1;9 g6 g. o, z9 H
return true;* J ^4 N/ i$ |3 u
}
* d/ r( ?8 s0 x" o( h private void cpy2deepArr(int[][] src, int[][] dest) {) v) L5 i5 ]* P5 Z7 w- ~8 I
for (int i = 0; i < src.length; i++) {
3 x+ y' I$ c, w+ e- ? |: O for (int j = 0; j < src.length; j++) {! J( O K+ w* b, ^& @' }- m0 D+ r- v
dest[j] = src[j];) j' j' g' \, D9 r
}
, E3 J/ B8 g* o# h& c( z# A }
, \: M9 j: O# `* \5 x( Q% n/ u }
; g8 y7 k- Y: c. [7 E* Y; V5 O+ l * x3 x3 }, \ Q& t3 @
public void printNowCheck() {
. F& P6 n' p8 k f for (int i = 0; i < bs.length; i++) {8 f. o g% p4 i0 e F
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了/ F$ _$ ]: o7 e2 a
break;- v: |# a/ R# e) A% B, `
}
& U2 Y- C T) [% _9 y //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出( L# _/ b2 i( } @9 i" V. r8 H) Q
if (bs[0] > bs[1]) {
% N8 B/ |* F( k6 h- W9 q System.out.println(bs[0] + ":" + bs[1]);
6 | V8 k3 r1 g- Y8 @2 j } else {- d1 I3 e' h3 c7 p$ v1 @9 c+ S
System.out.println(bs[1] + ":" + bs[0]);
3 X& C. l3 C0 C' }: l! A" F }! j! r; _* h6 N6 D- D
}/ F% i: Q% N( L8 R
}
. o+ E4 x; ^. Q2 M. H4 b' Q public void resetCheck() {
3 S- ~! M3 G6 ?; b7 `, M for (int i = 0; i < bs.length; i++) {
! ~$ Z3 E8 [* r" R4 [! S bs[0] = 0;
' t2 J/ N# V' y& w bs[1] = 0;
6 ` n+ p/ }3 O' J, w, N# Y# e }
~8 l. w; I" ^4 c) T9 K4 p( i: w }
r- a6 ^( {" l; H8 B) r) C /**
6 {- ?9 Z# w$ K4 `' N: E * @param args4 @3 m/ }" Z. d
*/
2 o) i9 V- _9 Q public static void main(String[] args) {
, V- [3 x# B. y( f0 C$ T // TODO Auto-generated method stub0 L( K% H5 T0 a' [( \. o$ V% m; z/ m( T
GouGouShiJiFen obj = new GouGouShiJiFen();
5 x m9 [7 t0 M- } int[][] testData = {
0 Y5 v/ h9 m/ }6 x" x X( c% R1 d {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},; h5 }! @2 o5 e M
{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},: y; ?- R B- s& E/ c/ r7 z5 W
{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}
& z8 { s$ J% d& B I ]" G };+ }7 c/ f2 H+ c8 Y2 ^( v& ~, \2 D
for (int i = 0; i < testData.length; i++) {$ h3 `% _( n& n+ b, u: I, p
if (obj.check(0, 0, 0, testData)) {
+ R' Z* h. t. R) Y! m1 @/ M3 a) j obj.printNowCheck();
+ v9 ~- ~9 v7 V* n } else {) N& z% r4 y: S- P
System.out.println("Unknown");
$ H+ f0 Q4 g3 N. r3 Z. H# { K! D }
* J5 f9 @% I0 e8 t9 Z% ] obj.resetCheck();# g" S& V0 u, L5 A$ g' I8 ?! ^( m2 Q
}3 E# Q* ^5 |- P2 ^
}9 Z7 m& X H; H1 V7 w4 v7 O
/ T. I/ r$ G, K
} |