题目名称:蝈蝈式的记分 7 ^+ n+ j4 }) r4 P
& I* q( L7 i7 W2 Y内容描述: 3 D+ b3 h. m% m
) x0 U, I- ~4 j/ C+ p
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 : S X! u4 J' m( r4 c* N$ E; B
' D7 y7 v1 Z8 f5 X因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
! h4 E/ i1 Y5 n' I
& ` Q/ b2 H/ J- w$ T8 {( T需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
9 p( g( V& `1 a' c6 M) [/ N8 f4 q' o1 U8 i0 m2 Z! I& X( q2 N$ |
输入数据: . v f( J$ k: _8 V
7 m. a: l8 @9 Q* G以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 " }! u, G3 `- d
0 g6 k) w( E% K5 r) q/ X
输出数据:
: P2 z( B5 t, [: R+ m) g t+ z1 w0 J! g+ b/ Q
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
# k+ c k8 K* k. M4 ^1 p
9 g8 d1 y# e* Q输入和输出结果数据样例:
) G# @: j9 Z/ Y4 P0 N: d; C' M' ^6 A" m+ R/ y7 m& i5 S
输入样例
& M; X: C; M" n' y9 T4 ^
4 g5 g; g# g4 t3 c3 _3
* ^2 L6 r+ g6 M0 }7 q, e
* h6 `# g; T% W: a# A" H23 + O7 l' @9 X5 Q
, O5 T3 D* ^7 B" i
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
. m- T3 X: A) i+ j% W+ ]5 d7 L4 N+ n2 H% F: J" P
25
" {" D5 r$ O( g5 ?1 `' S* J- W
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 # ?; X. Q2 M- n$ V
' K3 ?/ d/ A$ g; s( v$ F43 3 a$ ?9 c" i, f3 y& j7 M
v) A5 n: P5 H# q4 D) k3 s5 D7 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 ; O7 S# }/ c! A7 F! W4 G, s( X* D
$ {- f( q! ^% C. f
' ~! T' F& F w' r
输出样例
s- k, t8 R1 E/ G1 z( ?
7 v+ M8 y# `9 ]3 N2 ^% T2 z21:17
7 ?3 [5 {( M0 ^
* u9 z& D. W1 p! `% n; Y9 ^* Q24:22 , T; X7 b: G8 X; {! ~$ L
$ u" N6 u) }5 ]& M4 |21:3 7 @6 V/ X- I! C$ Y' g& F
# L, K/ c8 m+ [7 YUnknown
% H9 N1 i `; F4 |
+ E; k5 L! Y' u# B0 `" Q21:14
7 I& D( I) h/ N2 } l9 [/ U2 c. I- j: [
20:22
* z( [. @$ i0 T/ z$ E4 u, E' ^
, f9 N( O4 Y3 b0 M# M7 x21:23
0 a1 I( {7 D: v: h! t# `1 p
2 W+ o- e5 w3 d21:16 7 B1 u$ d, S) U# |6 I% K h
- a3 d9 m) k+ X/ ?21:9 3 j! {9 I: p4 I* a4 z
. _) n4 B( A d) s/ X; x
, o, H; L& L# m$ A( ~example: public class GouGouShiJiFen {, {; A b8 q+ s$ b% c
P; x7 P3 r# J; a public int[][] bs = new int[5][2];//当前可能的比赛结果
( h7 |5 @% l, g3 |7 i// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
- y1 x* E5 s) H// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
: S( z4 U( Q% ]// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown( O' Q9 f- r! H6 T& \
public int numOfAbleJu = 0; //本行比赛可能的结果有几种
( r* O* O; f0 S+ @" }* D! @6 |- X
, f9 C7 [+ w* b& x /**7 M' F- b7 v: L
* @param index 连续得失分的index
! j4 p5 C# A6 a6 @ * @param scene 第几局比赛; ]# M2 r. v7 L7 S4 {# e; f" h+ t
* @param whichPlayer index处分为哪个选手得分0 k9 @" G1 `2 f. j8 `8 i2 |
* @param record GuoGuo记的一行分' T$ k4 S5 w: J) w) G2 L
* @return 是否是一种可能的比赛结果
5 A+ l7 e. ]+ S# I. \. @' m6 s8 ~ */
* }& m( n0 x% o* B public boolean check(int index, int scene, int whichPlayer, int[] record) {7 T8 f& m7 R8 _4 x: y3 g$ P8 T
int playerIndex = whichPlayer;
3 |. P9 W8 p/ N6 Z# n) b9 B" v+ V boolean isWanZhengJu = false;
! r$ f3 c* C5 {+ k/ w) G for (int i = index; i < record.length; i++) {" D K5 l. Z' J
isWanZhengJu = false;
8 Y% ]7 N/ P! N: x0 v playerIndex = (whichPlayer + i - index) % 2;* ~# k6 u0 G' |+ [# _/ [
bs[scene][playerIndex] += record;0 W7 M) `. P" X8 @1 w- \8 _
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局. A$ S! y( v3 I; W$ y: P* ^; L
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束9 L( f( j3 J& M4 ]. D
scene++;
/ y: N% Y! I1 {9 _& I whichPlayer = scene % 2;- u- v* J6 j3 Z( M R- m, ~3 D$ ]( `
index = i + 1;
" D. O4 _8 K3 R c- l isWanZhengJu = true;9 r: i0 y. M0 p) b
continue;
$ x5 K! F/ T( a0 r; j, S. C* X } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的2 g0 s0 [, ~2 [
return false;
. C; R( F- s5 P+ G& y+ i }1 r$ h2 ^5 g9 y, |0 G2 D
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的7 A2 B% c M0 a+ Z' x( ]4 ?
return false;
7 Y' U# v" S) ] } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束- R# m& m: B# R, e: W7 M" E
scene++;
1 {$ _2 b( @: U whichPlayer = scene % 2;: ^# A! j. n( x
index = i + 1;
4 K, E0 d' T! C$ K( x; F4 I isWanZhengJu = true;
: f3 T/ ~8 _ p" t4 ?) ? b/ x) B continue;
/ K+ N3 i% ~. Y* b, z/ F- f6 X }
8 K+ R1 d" w; {! }/ w) |$ v# M" H if (record == 10 && i != (record.length - 1)) { //下一个数分情况
* H5 F5 Z& D, } int[][] bsBak = new int[5][2];7 w) t% k/ }/ k: U3 ^1 G
cpy2deepArr(bs, bsBak);
9 s4 ?1 P1 X5 k, W if (check(i + 1, scene, playerIndex, record)) {
" m/ H$ i/ x: u3 a cpy2deepArr(bsBak, bs);
2 m- s' T2 I( F# Q8 R if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
$ p3 b( R1 L; ~ return false;: X2 J. a+ u* a: u/ O _
}+ k7 p9 g4 Y+ ?2 L6 R
return numOfAbleJu < 2;# K; i+ Q. ~) i
} else { q- i5 ?) k( Y% q: |
cpy2deepArr(bsBak, bs);
7 ~2 W/ o' m, \) w if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
# Q+ d& T4 ]/ o. K: u return numOfAbleJu < 2;% q) M& ^: x& F" ^' {
}- _- h% _% Y* ?# Q) i( e6 |
}( B' j2 l4 X: X5 S* c' J
return false;' x6 H. U. r- Z( P$ q1 s# q' _
}
9 ?9 Z1 a% Y) m9 S" ~: A7 F% l1 b }
$ w# A' C$ i, p
x! J( p( K. W% V6 W if (!isWanZhengJu) {" G3 w/ S' l: g% X* S/ J7 h9 ]; z* C
return false;7 C2 x" V3 n6 R& F% d
}" f& E! T1 z. U6 S& O
// //检查是否符合五局三胜3 `; l8 T7 T4 q& O: a0 R y5 g
// int a = 0, b = 0;9 ~9 L6 w* h% S8 ]2 Z. [
// for (int i = 0; i < bs.length; i++) {
' f) O! T9 q) O1 U# q1 m// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
9 V4 e; Q7 O( d// break;
( [7 O2 n, E- z5 k// }7 s8 ?& [! _# \3 m
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制 o; r/ H$ P$ [# K
// return false;& ?; D& @: {( c+ I3 y* F: z
// }3 R/ z$ q3 ]( U, @
// if (bs[0] > bs[1]) {
- [% [" r [4 U% Z* Z J4 t// a++;
. g/ N2 I; O G' p+ U// } else {1 R! @* z+ X/ W$ H* r/ ?% [$ ~
// b++;
4 ~9 D& I, c, v* h. y8 h: p8 f// }
" F1 ~+ u! B! p7 @% Y* `; _// }
+ j2 N* m' A0 O9 Q9 |2 G// if (a < 3 && b < 3) {//没有一个人得三局,故错误7 K7 X2 p0 r8 a% h3 p: y! j0 |
// return false;
8 ~) o9 G u& `: _, X5 B! ~1 T) m4 w// }9 c/ a( v% r/ k2 z
//只要有三局及以上正常结果,则可视为OK
/ |7 Z8 n) f! w. d int count = 0;
* A$ ^! x# |- F/ B4 y& X for (int i = 0; i < bs.length; i++) {( f5 J/ U1 n& t) T
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了+ W2 P8 [$ b) y3 B
break;0 F) q) W4 F/ f; [( Y u& a
}
+ ]6 M& E! H2 k0 f7 N count++;
5 p* u5 X; u5 X$ t }
) H/ P* O4 h3 l9 C8 i# ^4 t) h. I if (count < 3) {# n4 {7 G4 ?4 j: n0 ^: \
return false;
) I3 ?0 \; G( {8 r- A: w3 m0 |4 y" P } X; S: o( z, ]
! r; \1 P' b) { numOfAbleJu += 1;
" M# L$ Y0 g% y x% W9 f return true;5 X$ |: r3 v- e9 U9 y) M" a4 l8 o
}
5 O( ~0 h- w! i( S private void cpy2deepArr(int[][] src, int[][] dest) {; o6 S( ~* d {( U9 d3 J* V, N& s* j
for (int i = 0; i < src.length; i++) {
! C( z: \2 s8 Z6 q, |3 Z for (int j = 0; j < src.length; j++) {, v& P* Q: @5 J% H3 N2 h5 `
dest[j] = src[j];; |- o9 ~0 S4 s5 u7 ?( ]. @8 H2 l) e
}3 G8 b) E, D% H8 d- D# f( r
} g" s: Z; c/ y7 J$ P3 c
}
* G# ~( d/ O8 F' g+ D 5 `( ?; ^: m6 Y# q4 l$ b
public void printNowCheck() {0 b2 [% }9 A7 }/ Q
for (int i = 0; i < bs.length; i++) {
5 v2 j3 D' t! k! M if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
. p: C7 y. S& |0 ?1 ?! N$ e break;
( h( N% @' d/ J7 F }
C. P: s; Y6 K5 C5 z, ~9 y3 l: V //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
4 ^+ n! D3 f. e. B' @ if (bs[0] > bs[1]) {
& c+ Z$ t" J3 d0 S System.out.println(bs[0] + ":" + bs[1]);
8 k9 L4 ]% x& m8 L! X/ E/ R } else {& Z0 ~, B7 x, E0 s0 {) c
System.out.println(bs[1] + ":" + bs[0]);, q& G& \ R0 C c+ Q) P0 K- Z
}
& b: `% _9 e0 p( k4 ~, q }
/ Y. a# k- j9 b0 b/ r }
$ |! D9 K5 {' x. v; v public void resetCheck() {
/ k* i: Y) q6 m for (int i = 0; i < bs.length; i++) {
' h5 b+ `. D+ z7 I# N! o bs[0] = 0;7 k, }$ h8 F( L9 n
bs[1] = 0;( t/ j. `" C8 z: l" o8 z' ~
}9 U0 h% m3 O, i4 }# g* J
}0 Q6 e" Q' @ C$ E) J) A' L- v' ?
/**- |9 y; c7 G, Q5 S4 j" \. U T
* @param args
/ H/ K3 U N% D7 K2 m6 p" Z */
2 w; X. {" c J7 q; ~4 f; J9 o public static void main(String[] args) {
, V) L" s6 N" D8 s // TODO Auto-generated method stub1 N! ]: {9 ]1 a1 z) Q, [4 T6 Q
GouGouShiJiFen obj = new GouGouShiJiFen();
6 X m* E$ W z3 U. F( t6 E int[][] testData = {6 B3 |6 l" O( a: n u$ r x
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},: ~4 P+ n+ P& w- C0 t' D
{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},
* `$ @5 z" K& v2 p) p, j# _- 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}
4 k; p) Q/ n& Q) p };
f+ U0 g2 n5 r% Z for (int i = 0; i < testData.length; i++) {) D. h3 H" W5 j1 }
if (obj.check(0, 0, 0, testData)) {& s) K$ L; {, m/ B: I% x6 F
obj.printNowCheck();' b/ Y4 Y( P# g8 g
} else {. e( Q, w( Q l9 T& Z5 e1 w
System.out.println("Unknown");
+ i6 ]3 K \ q }
) y/ \1 A% ], U obj.resetCheck();
K( X# N# P4 E. V- \- _! t9 L }
( G& G4 E' H2 V) R7 ? }& ^/ Y# j2 D3 m
~& C9 z: H. F. s/ o9 z% t
} |