题目名称:蝈蝈式的记分 ; U, J( S) c# L* \% L- [ T
N% {$ b( V r3 H2 Q6 }! P
内容描述: O( m( F: y n/ a. T& B2 { k
" N4 S: k& H+ M3 N- T+ d
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
* Y* B/ b- P. [2 c( p
3 {/ f* V3 e9 _: I/ k, P9 N' N因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 ( F' F2 z( [ |
2 w/ v: s' D$ `需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
' C, ]8 [1 L4 W( t$ o }& ]' t; Q; b% x6 P2 |
输入数据: 2 C+ t {6 |( s: t! d" p/ g, |% x; \2 D0 ]
7 {# M, J& H& {; a以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 / R) I# w; R1 }$ s+ G& i4 X8 Z
F# v; u) ]& U4 M6 j- K输出数据: 0 c! a n/ r) V1 x
. s. P% T6 u2 T
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
1 N9 a( N/ h# C; I0 F2 d [) J+ ?; e- L @- P6 Q7 H1 [: p
输入和输出结果数据样例:
/ u' P) K5 Q, B I* k0 Y
8 o F4 D; o! V/ i输入样例 . z8 \3 _+ L1 D/ d. R9 e9 W% l0 H
5 O- ^. F6 o6 G) I
3
# Y/ f4 F( _, `2 `- ?' i6 x* [2 {2 `* d* z" B' D( U
23 ; s0 W/ J0 `6 L+ A5 b$ q9 P
- r5 d; n% F/ [) K+ O4 o
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 5 Q3 z$ U, y% O5 J" f
" @ G& A0 x- b2 B
25
6 j6 ~- o; s3 G2 R$ H
1 E2 U9 W$ V! _9 X9 3 8 5 4 8 3 9 8 4 X X X X 2 X X X X 2 8 4 9 2 4
% N9 `9 B# m' a# ]2 ]3 S6 v$ P& X# h a- ~) M6 a" Q
43 6 d7 N- c: J7 T! `# G r% Y
7 [, z; f2 r R' o% l4 r' {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
1 \7 ]5 L$ e. r6 w0 U2 W5 A 3 j$ u0 H9 z8 Q/ h/ F
' S* Y9 i. l: `4 h
输出样例 * U4 {- p W# q. K% ^- E) @7 [
% ~9 z( u5 J1 H3 j- j O: u O" B
21:17
5 k& G W2 r5 \0 J" y0 G- z; e, u. |$ k& W* l
24:22 3 U% \- |# i$ E: _2 c. X' D
7 ]/ T& q% Y$ s5 s: P4 P21:3 # {" _' T, |" n2 _: Y2 b% i- }5 U
1 V; g* i: `, Y% S! a+ X. k
Unknown
# }. w& q( V) g. C% X7 A5 Z* i) a \8 {# i3 N( E% O
21:14 * X4 n7 y H' e& o' |
3 `( l" [! P& r* o) b& B8 p
20:22 8 I7 l& g4 q6 y) n
; o. S% f0 [8 ^( h, x6 ~2 r
21:23 & w F9 x. Z' w# k- A p
6 r3 ]6 ?+ } k( F O' a3 E21:16 / P1 ]6 o+ x5 ?* b. C/ ]$ f% f' w+ `
3 @0 H8 O4 [$ L6 m# p N
21:9 ) U) t1 P& ^) r3 x: G7 \, K" x" l. J
7 T6 j) [3 w# V! B
) k1 u' i. M b5 l4 G& |/ vexample: public class GouGouShiJiFen {9 O' m, `0 V( Q
; q! x2 x5 |! u: v# I1 }
public int[][] bs = new int[5][2];//当前可能的比赛结果
9 s( v9 q! Q2 E9 a6 V# S// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果! N/ C! J& f( c3 W6 d( c
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
- @1 \' q* E& P// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
* u% D& A4 |* G! h1 B0 }: V public int numOfAbleJu = 0; //本行比赛可能的结果有几种% {7 Y, w$ X7 n+ S4 K$ D5 S7 d
O; l$ ~9 d2 }2 U" r$ _. ]: S: V /**
* @( C0 R& V! p2 z' l * @param index 连续得失分的index8 p8 k$ X3 b- S& A" P7 d4 l( R# A# A
* @param scene 第几局比赛
, f, g6 n! d$ T' |$ y, F5 c * @param whichPlayer index处分为哪个选手得分
) t* C5 Q0 L3 g2 K- F7 `; ^0 Y * @param record GuoGuo记的一行分
# P: e6 c4 O" z( B5 x. @+ ^ * @return 是否是一种可能的比赛结果
0 r: o* |* g5 @- L/ Z */
* B( D& X& @# \ public boolean check(int index, int scene, int whichPlayer, int[] record) {8 j0 m& h+ Q! l6 Y0 B9 p- p
int playerIndex = whichPlayer;
( |( ], a; _& u3 f6 A boolean isWanZhengJu = false;/ Y2 F V1 d( d9 L* `4 Y" V: u6 U
for (int i = index; i < record.length; i++) {
, H5 x7 I# ~4 i1 c: ]. k! c isWanZhengJu = false;
2 o3 M% q2 ?+ ?3 H1 O playerIndex = (whichPlayer + i - index) % 2;& L2 |0 v. l3 H M1 p$ D
bs[scene][playerIndex] += record;$ m! Z9 R( h5 e: _1 f
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局3 `4 {+ \& }* o8 G @0 a4 V
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束: Z I5 d5 \9 C" C* X- V
scene++;
" A- f8 j& r! O$ p, N whichPlayer = scene % 2;( B0 g1 T3 o& C: m; d0 e4 S5 N
index = i + 1;' w& E% \/ o- J8 l
isWanZhengJu = true;
6 f+ O7 P6 v& ^/ S continue;
: q4 E' m5 }' p } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的( `; z2 s7 G& y/ {- `8 Z
return false;( a f- [6 J9 j
}0 y" N* L7 M, ]2 q$ {1 ^7 T
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
) d. W" J! W+ X return false;
& W8 j' h: h8 l6 P8 v } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束% c' I9 H5 {' m! ]
scene++;7 k# x6 ?8 V! w1 ^! \7 G6 V" Z* W
whichPlayer = scene % 2;6 o! U! _* B3 t: ~
index = i + 1;+ k; J4 s' K7 [: `8 c1 ~3 g
isWanZhengJu = true;
- C$ }. M/ I/ [4 w( Q4 r4 D- k0 G# h continue;7 r |( u8 z* [3 `' J& R5 C/ y" U
}7 G5 V$ V- J& _! o
if (record == 10 && i != (record.length - 1)) { //下一个数分情况
g& S* [7 @. s2 Z) T7 ]6 v& j int[][] bsBak = new int[5][2];- B% A5 x+ |: z' I8 F _% O& z7 `
cpy2deepArr(bs, bsBak);
2 R9 R4 M% H2 T7 y) c3 M if (check(i + 1, scene, playerIndex, record)) {7 X2 e c$ A& i9 }! S
cpy2deepArr(bsBak, bs);
" `+ w% J5 v% _ if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
2 [% ?# W. ?1 ]% V: C' i( a2 C return false;
! i1 K/ S% a% W5 _6 |* s }3 t/ ~. y7 d& x0 z& P/ P
return numOfAbleJu < 2;- p& u# ?3 _& F, A6 M
} else {
c" M) W# ~; h, ^5 C( U# m cpy2deepArr(bsBak, bs);
0 `( q, d9 J7 }% W/ s if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
: {5 \5 z, @: o return numOfAbleJu < 2;3 B' B6 m) \" C M% A* k: ~$ I
}
( R* u3 Z/ m( O/ J$ `$ x }
8 {# ]. Q3 q* ^; K7 m8 \4 g, L) _ return false;
, o/ m! ~: e5 X$ `8 { }- x1 w, W( l: s' X. @
}
. z- s# b4 S$ o L 3 N5 V! k6 Q6 [2 X
if (!isWanZhengJu) {
9 B% s0 w, |2 v# A% E& I/ Y return false;
$ a e, M9 R9 m [4 k }% p$ E3 }& ~: Z7 Y. Z
// //检查是否符合五局三胜
( G0 X- W* J& w9 q$ l6 ]// int a = 0, b = 0;) B5 L4 |, U: ~
// for (int i = 0; i < bs.length; i++) {
. R1 F7 Q* y7 B" }; ~6 H// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
# s+ U2 q: M1 k+ N2 c9 H// break;
2 A5 {: d, m# ?& x+ ]( l! S2 o8 r// }
. G) ~) F: j6 q1 i4 d// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
1 L2 H7 R6 @- O5 L$ u0 a+ o// return false;" B: I k% D [( a8 ?2 d
// }
7 L A/ u8 C& r5 y( i& Y' ^// if (bs[0] > bs[1]) {
% i# O2 [+ {" F// a++;2 D: C9 b! U' O, D
// } else {
5 e R/ |- h& u5 Z7 L// b++;
& r! ]! [5 u8 z3 C// }0 X T* m' c9 ~6 D0 ~; U
// }+ x; O2 c5 e/ F' D2 ?* L
// if (a < 3 && b < 3) {//没有一个人得三局,故错误. P$ C) m( m) K* H, g: Z, I2 p
// return false;
) G) T4 Y4 I, T8 j! u& Z% U- c// }* q3 L3 I; v e, X+ }
//只要有三局及以上正常结果,则可视为OK
6 q% H4 Q" K. u2 U* S int count = 0;
7 Y& _' y% v. `& I8 p. S for (int i = 0; i < bs.length; i++) {2 R) M/ Q3 T% M- ?6 B4 [
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
+ ?! U2 D- `$ ^" e& j8 X6 a break;7 S! ]$ K& I1 D
}: E$ t1 Y9 V; O/ m3 J
count++;3 m. S2 n5 e6 `# o( l; x
}
+ x f+ r1 U) M" H+ M if (count < 3) {
7 B9 D: z) ]0 y: i% K return false;
2 i% M8 g P+ ]" p' F* ] }% B/ s& X7 s# a G2 G6 A& O
' ?& f3 d! I& T, U numOfAbleJu += 1;& I$ I- [+ v# W; V; ], k, \
return true;/ M# }5 `' H7 t) Y
}# V1 y. d" i2 }1 [$ i
private void cpy2deepArr(int[][] src, int[][] dest) {4 ~* r" A6 S- ^1 P7 W- l8 B) a
for (int i = 0; i < src.length; i++) {8 ~# @5 F- C2 J
for (int j = 0; j < src.length; j++) {, e6 `7 n# o) H8 N/ [" m% z
dest[j] = src[j];, E! z% w5 h) l! s3 U/ B1 k/ J$ y& _
}
7 x% A/ H5 W" i( [5 T% T }
' y6 g: E6 |7 a+ W }
$ N' H' c- q6 I3 r: g+ f
+ E0 l1 g8 i* p& c public void printNowCheck() {
; R8 E# R; f! i4 { for (int i = 0; i < bs.length; i++) {& ]/ [% ~3 Z# r% }1 V
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
5 |& E j/ I; e$ G" `7 G& O0 | break;: B2 m6 E! v' z R6 _; _% T
}
6 ]( a: I5 z. a' n& z //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出7 j- r, j4 X, t0 U p" I
if (bs[0] > bs[1]) {
6 C# z8 ^5 s. t4 W% b( F/ v System.out.println(bs[0] + ":" + bs[1]);; F$ O0 L/ ~ C* U
} else {) V/ v- A8 T! ~: {+ u& z
System.out.println(bs[1] + ":" + bs[0]);: n+ E. M- `7 S9 b. ~
}
2 r" g' G [8 ~" Q }
/ |& e) n3 R- s8 r8 e; P2 N }1 E$ r8 M* o+ Z' ~/ F( m
public void resetCheck() {# K; P# \, N0 w( N
for (int i = 0; i < bs.length; i++) {, {+ W$ a3 X5 E, K3 k b- j( V
bs[0] = 0;' S8 K+ a+ U, W1 k
bs[1] = 0;
3 P! S: ~- l5 H+ W, g }
z/ }3 I; s3 M }
# Q& T/ c" ]# v6 N% k, C& ~ /**' E" T$ N5 y% n! j- u! v/ I
* @param args# H! ^3 r$ ]( Z7 N1 m
*/
8 t; v2 D: i, X9 v5 r% C$ |+ [ public static void main(String[] args) {2 t6 z. u& |3 K9 ^' l
// TODO Auto-generated method stub% f$ j9 a/ ~; i" U
GouGouShiJiFen obj = new GouGouShiJiFen();
2 l5 P+ @ a0 }% q% z, n int[][] testData = {& b0 w( Q( o7 [ O4 V
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
& h6 y- Z; R: V; s {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},
% p) G8 ?' v* o/ r6 k! ?5 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}
, N& H# N2 `) u# j8 S9 g };
6 q6 f, m9 F) j F" R0 N, v for (int i = 0; i < testData.length; i++) {
% _ ?! v& A, ]4 y" r$ J if (obj.check(0, 0, 0, testData)) {9 d/ L6 u7 W# X$ `9 H) U' N' O* U% M
obj.printNowCheck();7 v8 M+ d3 ^; o% Q6 \$ Q
} else {6 t& h) p. x' t* L: J- }7 H
System.out.println("Unknown");, [9 V) A, @4 ~' Y
}
5 j% @# t; F$ W, e9 ~ obj.resetCheck();6 Q) l$ F) A$ [8 P& m# \& o
}
" V3 F& X7 ?# `, s }7 Q/ ~) K) q0 d: Z$ ~( h/ _) o& b
5 Q0 I, H1 k$ k
} |