题目名称:蝈蝈式的记分 # O$ r; d* |6 p7 N6 T
) z5 S- A! K# S6 E* b# G内容描述: & x" P& M: m, H# h' G
8 Z! w+ z4 g! ~+ ?3 t- y$ h( u蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
- Q( z% V' i7 c: c4 a' `; N, Y) C& D
+ x- z& `7 W" J# c; O& R因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
2 [4 M5 j! ?" }+ n4 J' b( S/ d0 F# X+ _
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 ( p A1 N( l/ N, D8 k. v C
6 ~5 i* F" u) ]. i2 I
输入数据:
& r, q- _) W$ `; k. o
2 l" t" P# _4 F& W以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 + O) t. z7 i: Z: b0 q/ _
u$ ]5 f& p8 q8 h8 ^- u- ~输出数据: + T" k5 } g/ h6 z& g: h6 g
2 }# q/ p0 C8 _相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 / J: z1 _( @* T1 r6 i* S
# A& f! m! |% _7 R输入和输出结果数据样例: % a8 y- t& I: C; V/ x
2 c& t$ c# q# \ r: a- P1 G
输入样例 2 b6 m: P2 m e0 G, ~6 a! j5 _
) g" U+ P. H8 n( p8 ^. x% S3 # u; h& _; t( J" Z4 Q- u
( w$ _# c, A; S1 \4 U2 R/ t! X
23
) ]/ Y* I- k# Q
7 p1 c6 Q/ r% D9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 $ s( `% _* d/ {4 l9 c w5 K
# \8 y: l V0 E! L4 q7 o* H
25
! h6 P3 {& a/ f+ j5 m8 ?; q4 {9 N$ r% d9 ^, f. O: i+ N$ H3 M4 v
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 5 }6 p ~9 i# T& \
, L6 N* C* V( H) ?* T43 2 l8 @) [2 s A9 I( d% e- }
: A( Z) X. `+ u d
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 5 U. L6 |0 b% t p9 X0 E
/ I. ^& ]( y8 `
, {( K2 |# d! a0 \) |5 T" q
输出样例
& O# s# R* ]( Y v, V' i9 Y1 }: H$ v3 n, p# A
21:17 8 b3 L1 u3 r6 s
/ x$ G) Y1 ^+ M* G24:22 4 f& r! q' Y. e m& e
/ I8 W& w# \* V21:3 7 q/ E% K# n/ h% A2 s- R
3 w9 w+ C( ]2 d) l7 y! S, {Unknown & a ?) L$ M4 z
( b" F7 P# {$ r: h5 _- S% X21:14 , w7 T% _$ @2 v3 p
: [& a3 p, n7 C8 L2 Y ^20:22 & T) i; P# z3 @/ T; ~3 f) X7 T1 `
3 r! p: x# k8 f5 t5 Z" v21:23
: t8 D& K+ q! T5 x" G1 x! V1 L7 H7 Y, _- J# q H
21:16 4 @; S3 B$ n+ O; ]% Y
5 @6 G+ `( r; _# i* D% p; f% ]- Q I
21:9 ( z" A+ D; U9 ~* W
/ o$ C3 {) Y3 W2 l3 V/ c f& Q/ U4 w/ j
example: public class GouGouShiJiFen {7 Z) V; l8 e n0 @' e7 [
' B! T6 c! |( `* d0 L public int[][] bs = new int[5][2];//当前可能的比赛结果+ U& t2 K0 U/ C) T
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果, ]9 |; d2 H- u+ R5 v' `0 l
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
/ x- K5 o4 u0 u$ l* f2 q* e5 x// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
4 z. W6 C! [5 s5 J public int numOfAbleJu = 0; //本行比赛可能的结果有几种
, z' S, O4 ]6 x/ S3 s3 p$ h$ e 4 l* z3 Q0 u( ^4 k$ C
/**
$ q0 ^) N" }, M' _- @ * @param index 连续得失分的index7 C' D6 h$ f5 p2 f) |; \
* @param scene 第几局比赛( r) B8 {7 z8 H, E! t0 ^
* @param whichPlayer index处分为哪个选手得分! |7 p, g8 w0 ^# }; D' n9 L7 A
* @param record GuoGuo记的一行分
$ B% v+ A2 I t; ]3 `$ } * @return 是否是一种可能的比赛结果; z. K" m1 d. g
*/
- E" r: e* x0 o* T, Q- r public boolean check(int index, int scene, int whichPlayer, int[] record) {- C+ D" P( e$ z2 ~- K% V% Y1 E
int playerIndex = whichPlayer;
/ R" z4 g5 T$ a' ^ boolean isWanZhengJu = false;
4 Q9 a+ t2 ^- y" \8 u4 p for (int i = index; i < record.length; i++) {
- y9 s: I1 W; y5 h) h" L' U* t isWanZhengJu = false;2 H ]3 e# _1 h4 z# R3 q7 }/ B
playerIndex = (whichPlayer + i - index) % 2;6 Q5 U- |2 y/ \
bs[scene][playerIndex] += record;! m+ M6 n O4 q
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
& Z. ]3 H* Q# D( E" n: C9 a" z' I* m if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
8 h8 y( t, ?; d( ~* V scene++;. V% y0 d* H/ J) t3 X
whichPlayer = scene % 2;. w- t1 z$ u" @
index = i + 1;1 n$ s5 R& x2 |& u& |2 z
isWanZhengJu = true;- {- V o: l" j' ?3 a
continue;3 b3 u! O: B% ^0 S
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
7 [ J! Q0 e$ S/ n$ i) u# S return false;
" T2 s8 t8 u# ?" F }4 _4 W" B1 U- [, a9 u0 R
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的$ }8 T1 |5 m( d2 q0 t2 \
return false;+ O- x; X; K# v6 b; [
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束9 ]6 y& Z+ C% S' m8 {$ g+ D, @
scene++;
$ y b( x1 e y whichPlayer = scene % 2;
$ `* ?8 `8 n) y: ?! p index = i + 1;
* C# z. B3 _& ?; o: J4 ^6 L' D# k+ L isWanZhengJu = true;% o- T" s8 R. X& ~* a+ H
continue;( `# Q3 n# ?3 D9 W5 T$ m4 n
}
% S9 B' ^$ t S/ t if (record == 10 && i != (record.length - 1)) { //下一个数分情况" c+ P- r2 b0 |2 r; A, h
int[][] bsBak = new int[5][2];) i. e N! L6 p% w$ t4 `
cpy2deepArr(bs, bsBak);& D* y3 @4 Y) k6 |
if (check(i + 1, scene, playerIndex, record)) {
5 W8 a/ v8 H q; ?7 m cpy2deepArr(bsBak, bs);
9 l0 N* ]( b# k& ]7 O' {- W if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
2 U, }- W8 F8 u0 U: R return false;
3 Z9 T1 d6 G. @ }( A5 V2 L x) |/ J
return numOfAbleJu < 2;
6 ]8 O9 ` B: ~# G/ U& v } else {
8 w# j2 i& y9 p* H1 K5 x1 U cpy2deepArr(bsBak, bs);
" `; G% x" ^2 @, O$ v if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
7 ^1 s* B1 a, Y- [' o* m% I return numOfAbleJu < 2;
1 z; M. H, f4 \+ W2 i3 T3 @3 U }
9 ]1 Q0 G) Y2 I }
, i8 V. R6 D- h! I7 v( e return false;
* U2 U2 U e9 c/ I/ X& e! Q }# H5 o# s: @5 M8 U
}
! e5 t! w/ @+ w% V3 c
1 ?7 p+ E. i. i9 v if (!isWanZhengJu) {
7 X. A4 _8 k, d" x; p return false;' K7 Y+ ?) G: |* J( q$ D7 `
}
' _4 {0 Y8 @' v2 H& l S2 ~// //检查是否符合五局三胜
6 D& z& ^" A8 h) |# \5 ^& K1 ?// int a = 0, b = 0;! e4 y F* I5 z% p
// for (int i = 0; i < bs.length; i++) {
]; y5 `: |6 S) S: `+ X- u// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了, w. a: t$ G; u& C/ e' p
// break;
5 n3 }9 U5 j. R$ Z' f) r// }7 E) I, d6 T' f$ T. T& _5 j
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制; X4 o" n( i' y& P' ~
// return false;0 C3 J* ^. F+ h E) f P9 U$ I
// }
8 b3 F0 p" U; _2 {& y7 N; f6 x// if (bs[0] > bs[1]) {. V, c6 g# P5 y4 L1 g; t" e
// a++; t9 x9 u+ c% {! p4 j7 l8 t/ E
// } else {
- p: S$ i3 l" W" O* p# G// b++;6 E- q7 q% D: S J
// }" E% P8 N+ F" x5 P
// }7 b& k: F* j |8 [. s h
// if (a < 3 && b < 3) {//没有一个人得三局,故错误
4 S/ u* o; _ l: X% P+ y8 o% q// return false;3 K! _6 t2 p. y1 x2 h k( x
// }
5 ~' h7 w! b1 w# ^0 t$ a //只要有三局及以上正常结果,则可视为OK
! d: y3 r4 @# ~ int count = 0;
! `+ T. h2 `- T for (int i = 0; i < bs.length; i++) {+ [) p( B2 @" ]0 p$ ^5 P
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了' y+ P3 c2 M" P6 a7 [$ z! w$ ?
break;) Z" F1 Q* d7 e
}
$ S; z$ R& @! B7 O count++;
: k* m7 [% l0 l) M }% P3 X- L5 _8 s7 t) g
if (count < 3) {. B1 [3 O* P) ^
return false;+ ^! ` V8 t: M0 y
}
0 f9 s/ n$ r {& w' F8 {+ d
; r& z6 Y4 a2 X4 M numOfAbleJu += 1;
+ D, D' l3 D6 K! V. m F0 L return true;& S& x& C# _$ v' O4 ?
}7 k' R1 [! h! h& a0 r8 b2 H6 u3 P
private void cpy2deepArr(int[][] src, int[][] dest) {
, [% G( G O6 `7 }3 D8 Q' i for (int i = 0; i < src.length; i++) {1 j. N) ^4 a" S( o3 O4 v
for (int j = 0; j < src.length; j++) {. [$ B% ?$ O" v( S l# M+ M G
dest[j] = src[j];' g7 o( c& F6 U4 w5 t
}
+ [% {! R% v% u, r6 O }# b; N/ O( ? W# K8 T9 Z
} T9 p4 c# F6 \1 V
6 a: _7 w7 t6 M3 H$ C public void printNowCheck() {- a, b+ J3 d. d; Q$ s5 s
for (int i = 0; i < bs.length; i++) {! _7 p* ]4 `, h: P
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
. Y5 s" \' U5 v- q3 o0 F- u0 P break; L$ N: h2 G$ g4 R2 O
}
# s3 y- l0 b0 h) q S- f" Y( ] //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
( n# z) ^5 u! Q! p2 x if (bs[0] > bs[1]) {
" p# M: ~; w: @, H6 B j System.out.println(bs[0] + ":" + bs[1]);( v, a) C5 {4 [& K( D; U
} else {" N# O! x' K5 {
System.out.println(bs[1] + ":" + bs[0]);
9 x, |5 V; j/ {) v2 g }. ?, H+ S7 M. ~2 ?
}1 h# W" Y/ ~2 `( F g
}. y9 q4 a+ m- n: B" R- `) Z8 @8 s( u8 c
public void resetCheck() {
1 F, Y% Z; d! u& U+ N) p for (int i = 0; i < bs.length; i++) {& |" ~. G( _$ N3 e+ B/ i% U/ \! j
bs[0] = 0;
8 M3 v) @0 s1 s) R- p bs[1] = 0;* x1 H9 @* f- V {. J: V7 r7 T2 y5 X
}9 c# M* f/ t7 w1 r
}- F: _1 P. @' r t
/**2 H( s* h+ s( U% Z. s) W
* @param args
U; t. o2 r' f( N */
& R: e5 f8 ]- e7 o/ V2 f, { public static void main(String[] args) {" K$ G2 R5 F! b$ I8 l4 Y4 v: J% k; W
// TODO Auto-generated method stub
' E% n" Y# R: _0 U; }2 |$ r9 D, s GouGouShiJiFen obj = new GouGouShiJiFen();; Q( J6 J, a7 [" l5 Z
int[][] testData = {/ E: Z0 U3 z/ E. c
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
5 T9 P9 q C$ W. P0 W7 F; D+ R {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},' m6 [/ X9 R2 w9 u5 V* n) e- f
{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}8 ~8 h, }, _, W& Q4 A% \) Z' |% `
};
+ [1 n9 b; U3 o3 v for (int i = 0; i < testData.length; i++) {0 K7 `( x. H3 {( B- R& W
if (obj.check(0, 0, 0, testData)) {
7 R+ I( W' Z: C% x" Q6 g/ B7 r+ ^ obj.printNowCheck();
! V- I- N) {# \1 @: Q } else { T! k Y1 a/ U& Y4 @- @
System.out.println("Unknown");
2 }8 S4 y2 _3 P F }) z* O2 y" c( F7 {9 z/ P! ^
obj.resetCheck();3 Y! O) i1 m# z( S' }4 k! t
}/ c" w" {3 z+ A# B% Y
}
9 M7 s- X) E! a/ e" e8 h, `; X/ Y& Z
% E/ F A7 ~) \7 z3 D' Y} |