题目名称:蝈蝈式的记分
~3 v) o9 c; t: G* W' m' T, J" F' a
! g. }0 ?" v. q, q2 B内容描述:
. U4 Y% L3 |0 M0 |5 p( i% r9 h [8 N& W( W
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
: v5 @ C. C, D1 ]& V4 R5 x" D/ I0 M1 V
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 5 \' P7 y: Y" X9 S
1 g; x' [' ~" R& H3 W1 Y; |" X需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
7 M9 K) K, D! f/ F! v4 p$ t* X6 D; ^6 y2 Q2 H7 s9 O
输入数据: H) i [; ~6 x1 H4 U8 H! W
4 G# j( k% I6 ^* e6 p以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 0 E, {/ Z3 C( _: v2 T& w5 T# T6 S3 o
4 @' ^" C( J4 N" d. n+ b5 N5 ~, r
输出数据: / W W& v3 h* c ?
1 f: Q8 q2 _; }相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 / T. I" Z C2 s: _$ N
9 p2 D; t3 y5 `8 d( S
输入和输出结果数据样例: * v6 r/ L! P" M7 j, p J, Q+ p* f
9 X5 @% E& z' _& ~) y9 ^
输入样例
d0 m: p! H+ K0 `8 K7 T
: u) j+ i' Y& K* x7 _, F3 4 ?3 y+ n: \; N- x- e' i( F4 N% s
& R8 B) ]1 g) N; c( y
23
- n4 s+ k8 i; v3 r) j' a+ C
6 L1 ^2 v3 B" }8 n9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 # P( j4 L6 N. V1 _% g2 L8 L
+ h* j: K1 B/ P$ S* h$ ]
25
$ ^3 `0 ~" Q' E* J! F7 C9 V% h4 [- T& h
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 - @, C4 m+ n1 p+ e0 T, f
- G- L) p4 L: [- o/ v% u0 Y! l
43 7 W) q/ ~3 X: X$ M5 B6 i# t
8 e3 p! a; i5 c) @6 u
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 " E# E k: G, L9 I7 R! V. |
: Y, R$ x: d* j1 D$ q# i) X: r+ {6 J+ }6 `; J; t( ~3 ?+ U
输出样例 $ b. \0 |- {$ S4 C% I: Q% S
! x, s% r+ W/ d) u% p# a5 E
21:17
5 ~( S9 {7 o; J0 | B0 `$ w( Z8 f" s' |3 }- H
24:22
" M: l4 m" R5 D7 L3 Z- j b& M; h8 s5 E; f+ v; D: \: X
21:3
, {3 X. x& p. M2 l, E( u- F1 g9 E3 E$ u: k" J2 ~
Unknown ) w* Y: n4 [8 I
/ k g& |# X: |* @ d; J3 s, D1 m5 `
21:14
+ `: y* E1 U5 d+ j# U# U" H
2 J: ^0 R3 }8 @% A2 v20:22 ! g+ n3 Q2 {5 e6 |) Y5 }6 v
. ]# w3 y( h. R9 S4 s0 e) x; ~. ?$ U
21:23
Z& R: {) U3 y% ^! @9 x& g; a* {0 z5 c6 S" _' K, o1 V. i5 R
21:16
' b H3 @% i, P- u
% P. u$ @- o$ X21:9
$ c- [* ]# ]7 |( _! m! G
. K( y$ n, f+ `6 k. z' H* C
% a3 R5 I# W" e& g) E1 |: |example: public class GouGouShiJiFen {7 P8 y* G4 j( n4 z4 m
) w) ?7 q/ Y& B$ L public int[][] bs = new int[5][2];//当前可能的比赛结果
. C- } `6 X- \) }& F. b7 T0 b// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果0 Y) n; k8 a0 L. s' @# v
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份, t2 X( A' h( J) K) ?
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
7 O0 B$ l: M( O9 U) \* x& W) ^, W public int numOfAbleJu = 0; //本行比赛可能的结果有几种5 M, f" a6 v& r2 `* c! |: Z
. N: `% |% i; I /**8 H2 t9 d0 y' k/ r4 R2 r: c
* @param index 连续得失分的index. g3 c- D9 ?; G- i
* @param scene 第几局比赛
# Q( C; E1 M, [7 {5 n, I r& Y * @param whichPlayer index处分为哪个选手得分
8 S, @! D$ y% G, A7 { * @param record GuoGuo记的一行分1 m) q o# V$ s2 z8 p
* @return 是否是一种可能的比赛结果
2 `; `- ~0 D8 W */ S! \1 U& r+ q4 n
public boolean check(int index, int scene, int whichPlayer, int[] record) {
; W5 v& u+ i" P2 A5 g; E) B int playerIndex = whichPlayer;
A7 y y. Z0 }7 O6 _/ g boolean isWanZhengJu = false;
0 o* h4 v$ b/ ]# N( X for (int i = index; i < record.length; i++) {% W# K, X9 |* b' L. @
isWanZhengJu = false;
5 Q o# W7 _, G playerIndex = (whichPlayer + i - index) % 2;$ U- R4 B0 c/ _/ @
bs[scene][playerIndex] += record;
6 u2 O% V+ A E; c7 D- C9 f if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
- f' k, R4 `! g8 a if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束5 _- D |9 t: q( R n) r+ `9 ~
scene++;, ?5 T$ ]0 R( M8 W* V% |6 [: \
whichPlayer = scene % 2;+ E' f i4 A) q% z2 c7 C) w5 ~
index = i + 1;
" C- F( Q' m7 C! F isWanZhengJu = true;
! `6 G9 z, _8 g! b4 I. ]5 i continue;$ g7 q9 W' F2 [ t' B j$ u
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的% R% n% I4 Q9 P5 P
return false;
) H3 u; _; [4 m& a5 Z; H) Q }5 S; @" n( }3 a& h
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的: }# }; L& H; i1 C
return false;, q2 H2 v2 r6 \7 Z, x
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
: H6 {% F9 e) b) \. H* l/ i- c scene++;3 ]: N( P0 ~: [& o+ | i; s* a
whichPlayer = scene % 2;# C8 v& M6 O/ o
index = i + 1;
* [7 Z0 p& Q" T+ t0 |. u3 ^ isWanZhengJu = true;
' }3 Y4 o" W+ n, H$ p1 g continue;
1 K5 ]* F g4 Z7 K }
$ Q6 T/ ]- S2 |! [ if (record == 10 && i != (record.length - 1)) { //下一个数分情况
2 C G G& j1 E9 \/ m9 | int[][] bsBak = new int[5][2];
1 \7 b1 `' L$ ?8 F. F7 K; p2 Q cpy2deepArr(bs, bsBak);
: n* J; ]# }) j. v7 U if (check(i + 1, scene, playerIndex, record)) {
1 Q$ j# w0 o% o1 d4 k( z cpy2deepArr(bsBak, bs);6 f% ~ J# P3 H+ j# n1 I; ?! V
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
" I1 ]( X( N- g6 T$ k return false;7 z5 p# k/ s8 {0 T9 l) ?
}8 X5 c5 ~0 f: w$ `% y1 u8 _4 p
return numOfAbleJu < 2;7 J4 b' ?5 Q) G0 i# s
} else {
/ J/ f; u: n8 T+ {4 i cpy2deepArr(bsBak, bs);# v9 Y) B! w+ V3 t1 r" C8 v
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {0 g! U: I' Z8 }9 M/ @$ d+ K
return numOfAbleJu < 2;
& R$ V {0 @+ H+ ^4 a7 @, B }
. ^) w" S' m) w$ l+ y }0 I7 q+ x, I; S, f; J% E
return false;# `2 G) @5 J3 A, F4 x' @8 z; H
}4 b& q* _) i( Z. ]
}
0 y& x6 V' A0 V& i
6 `! ]1 n( F0 [" |5 [4 S if (!isWanZhengJu) {3 A3 O) w0 O6 ]. j9 T
return false;
0 t! _2 H! R. L/ \ }% e( o6 b: ~+ g8 T( n
// //检查是否符合五局三胜
/ D- F+ `% s: n2 U& e// int a = 0, b = 0;
& u6 @7 u# j4 C9 [// for (int i = 0; i < bs.length; i++) {
/ j4 i/ w! A }5 z+ ?// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
# B+ E" K2 r% P9 r, v// break;" f& c% ?# |5 g k
// }/ Z; _% M6 [) T! I3 k
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
: G$ z6 i, q: _8 E7 ?5 P- D// return false;( b- t- w, }% _; ?3 m- N" ^
// }8 u' a ?) V8 R% M/ M! m+ [
// if (bs[0] > bs[1]) {, ?7 z! n: q5 ~5 _% T/ m, U
// a++;; }6 E D& |& s2 D, s. r6 V, n
// } else {7 H, \, K) k9 V! R
// b++;
4 q: z8 v- O+ H4 B3 w# S// }
" `' }( X3 D, r# v) X" _0 o// }
) K' n8 Z: A& \3 m N// if (a < 3 && b < 3) {//没有一个人得三局,故错误
: d) \9 W3 b8 q9 Y// return false;. |! Y# [6 B! _* s: C/ a
// }
m+ }. G$ x% u% H //只要有三局及以上正常结果,则可视为OK2 Q! p+ Z4 Y. B9 J9 l1 Z
int count = 0;4 [, x: i, d& c+ H N P
for (int i = 0; i < bs.length; i++) {
/ y7 w/ X4 @# @# M if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了2 B8 }* C! S* b) v
break;
& d1 k. e4 \0 ]; Q; S3 f# { X% q- f }, o% A+ G* t2 h/ r% G; w$ R
count++;5 g& o6 @: k5 _
}
+ C6 Y y4 j: T if (count < 3) {
4 f+ _8 X3 w( v: @# Z return false;6 B$ S) F2 F Q, J2 _( A
}
% F8 @7 u7 ~7 |# [0 {+ _
. I; x: @$ U, E8 Z7 A: y numOfAbleJu += 1;7 }) r4 p0 B$ B' Z; Q. e
return true;& k ]/ i( b) @' Y
}
, o- D# ^6 K3 ?$ M private void cpy2deepArr(int[][] src, int[][] dest) {* Q+ F7 v& e4 Q, H% J# A! [/ X+ t& |
for (int i = 0; i < src.length; i++) {
! H) f* \ U- B0 S! p6 p- k for (int j = 0; j < src.length; j++) {
7 I' H8 I2 G; ]# R dest[j] = src[j];
2 D1 [6 n1 {2 w6 y) j$ r2 ~2 z0 m }9 E0 C D, c5 X
}
, c3 l$ Z" a( a' O }2 h& j) W, N" ^' N5 y# l
B0 w% y" a; G
public void printNowCheck() {* e; x. v7 W( S! p
for (int i = 0; i < bs.length; i++) {
$ N9 u H5 i7 F6 B1 x if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
; n: E" _: @1 G break;/ w+ [2 X4 E/ m0 E/ l7 ] p6 `
}+ D( F' Y. X0 F: t5 E3 y
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出 u! z& N9 E$ j1 i
if (bs[0] > bs[1]) {
, ~5 Q7 Y' `7 G, l s# w System.out.println(bs[0] + ":" + bs[1]);$ u( c: n0 B: [) u3 d
} else {4 F' L; z% |* W; R2 r" V" b4 D
System.out.println(bs[1] + ":" + bs[0]);5 c5 I) d( p# R
}7 m% ]( g1 Q% x* L6 X! I0 k
}
8 y/ n u! w, o) G. s! y2 ^# `4 { }) Q; b" P# _, O5 n
public void resetCheck() {+ q+ m$ s& r( l4 ?9 T) h+ _1 z
for (int i = 0; i < bs.length; i++) {
4 h5 e& a# m: C" \' w H8 u/ M bs[0] = 0;
( E4 G; B7 M! {; C/ T" F bs[1] = 0;, T! e! F# f8 |
}! ~7 L( g5 S3 }! t) N! |. A( p: Y
}
& n' r$ V2 D; j. B; C. F( ~7 W5 g /**, O+ A( k3 g1 F
* @param args
: I6 e/ Q1 \" g' ^ | */
) G+ t+ b4 O6 q# E8 p& G: X% g public static void main(String[] args) {7 S' o* S; t4 Y- }
// TODO Auto-generated method stub
# w- }+ Y' _2 i+ [5 H4 D! ^) G GouGouShiJiFen obj = new GouGouShiJiFen();
* [3 s# U7 y; ^9 m int[][] testData = {
& g3 k5 {8 l3 ^' r& f. ? {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
0 x0 K3 ~" b2 _: V {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},
, k$ W# M) i& c {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}
% V$ P+ l6 R1 ^$ `- I };# m9 ?1 M+ c8 e5 L+ y# `5 T) W
for (int i = 0; i < testData.length; i++) {1 Y. r7 C- t! ]- E. k
if (obj.check(0, 0, 0, testData)) {; X. k) C. m, q! q8 C
obj.printNowCheck();% \' P: w; y% U( x" j) Q
} else {
8 J3 {1 {; e6 x- A/ X; d System.out.println("Unknown");
' g8 }( f4 m3 c) C' E5 N }) Q. W- v' q- d3 P( S- Y \
obj.resetCheck();
7 ^/ I$ G7 ] w0 o4 g" K V% ~0 b( v }' `; f" i: s9 @3 E1 A7 Q/ y) L/ C
}
; _: Y3 f& O! x! x3 t" F+ D! [1 u/ f% d
} |