题目名称:蝈蝈式的记分 " E! c8 b4 \6 A. ^) [5 q
2 z' |. y4 L- \9 u$ D- f内容描述:
: b$ y, t+ \0 F" k
1 O! s5 {3 H+ z$ L" d# d. z蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
0 c6 d) @$ k, S' h; I& m- O9 ?5 H; m8 F2 W
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
6 K2 T: k: [+ W! V$ t f+ b% p$ Q4 q9 @
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
# A0 X5 P* ~6 f$ r, Q% g# {, E0 U1 B2 F$ q1 _ q( b; d
输入数据:
7 _& S& g5 b; {4 X6 V1 h& }8 a0 [; [4 I# \ W9 t# x \8 d
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
1 f0 t$ A( b1 R/ ^5 m i$ L5 V/ ?1 H6 B5 _/ K
输出数据: , L$ O! ~! s8 x$ @% l
. d$ H f0 E4 W, H4 v. i* c相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 4 x% V2 H: T2 l2 W% J: {2 z
( p5 |3 P! f4 U4 i3 i! P! Y! a$ Y& r r
输入和输出结果数据样例: 9 H* P0 J/ N# A0 f _
9 M" W1 U0 b0 R' Z输入样例
( S. H, g: Q* W6 q" V4 p
( m& ~( ]4 d; T3
& E2 r/ `, [/ P
% j y8 d2 o+ b: U8 H0 g% B ]23
6 H5 M5 {* |& [% }8 n& Q0 L/ s$ d; x+ t# @7 M
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
- i. x' u4 [- p$ t h0 E5 h/ a5 |4 V% t9 u1 P) d4 b0 x4 d
25
& N- R6 C$ |% t/ c
8 G6 b+ Z$ e9 B9 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 i: t$ d. }* R! H7 d
# l* S5 P& G* B2 W% o! V2 P43
1 ]9 [% W+ {. e0 _. q- k5 d. H/ B; [- t/ y7 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 1 u* n+ t; b! a( H
6 e: l' b) s9 I B9 o, s) C
1 S% t, P7 W3 T Q3 b
输出样例
* g: ?$ a C; Q# @* k7 Y5 U1 d& O/ `3 n" u1 }" v9 `
21:17 " d* m1 ~# Q' J. a& S
) C8 ^7 k: ?; T. ?; m24:22 8 U, N* j @/ Q& y j
7 R+ N: x" ` K5 }/ I# Q- z21:3 2 J3 @( F0 T) n1 |" ^/ e4 x' L
0 }. I3 s3 \' G* i4 J( Q
Unknown
g( [) F* G' b) D7 [/ ~
* k/ z5 T- S: s3 n0 r% h21:14 & L) q5 p" ~; t) k' |
3 s" ~: ~, T, j+ C* W0 N+ n20:22
7 M4 K7 W0 |' N. h5 E6 m& G
; Y, E2 f# c1 g21:23 - y+ Z8 P% _. A9 W% T: A5 I; X7 X
) n) e O5 J4 E1 ^ Y- M21:16
$ B! h" ]2 U9 d/ X% e& i( z; n& T1 M |" e
21:9
2 T, m3 j) I& e/ M3 s- H5 N( Z$ ` [+ n # Z6 c' m& F5 a
+ U2 Y. Z2 N% _7 m: T" F$ yexample: public class GouGouShiJiFen {
5 s( u5 h5 b1 E, G& C* z$ S5 Y8 B
D4 U( [# b2 T, B6 Q; ]4 E6 O: d public int[][] bs = new int[5][2];//当前可能的比赛结果
* g/ r" ?" U' E w* p s' Q. e% k/ Z0 a// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
; \* W6 m/ ?% f4 g* k' Z// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份5 Z' p2 b. i& d
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
; _# x5 q* B) }) J2 Z public int numOfAbleJu = 0; //本行比赛可能的结果有几种
; y* T! |# S" C8 N% }3 P9 Z" ?
/ ~+ {. l1 L; W /**
, S, }/ x" J3 y0 D * @param index 连续得失分的index/ J! T1 p& [9 g' S. l
* @param scene 第几局比赛, d9 r, g0 P* @
* @param whichPlayer index处分为哪个选手得分- m4 @6 N0 @9 [4 w, `- |
* @param record GuoGuo记的一行分
" Y( v7 |% U) b, q/ t$ j6 x * @return 是否是一种可能的比赛结果
2 D9 `) `8 \) o */; B6 b/ R; s9 X' i6 n3 o3 q
public boolean check(int index, int scene, int whichPlayer, int[] record) {
! ^1 j. L+ k' k; S4 Z: { int playerIndex = whichPlayer;0 j- }7 `( D; s8 |
boolean isWanZhengJu = false;
9 p# E' Q1 m5 d* K for (int i = index; i < record.length; i++) {
/ {% q2 k% L" @" [% P- r* g6 `0 h isWanZhengJu = false;* `# T1 U8 l' |4 }$ h6 E
playerIndex = (whichPlayer + i - index) % 2;3 f: p5 {( ?/ `4 h' Y# e$ ?
bs[scene][playerIndex] += record;
4 D9 R: _9 {6 o2 L% \4 X3 Q if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局4 Z4 w& c e, [) i" U& t- l
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
$ Z6 U- d0 u+ i! r scene++;5 T! R% _% p. l! W
whichPlayer = scene % 2;
" Z5 h- i2 @ Z8 `2 T1 o index = i + 1;
+ R+ I r0 D( J( U3 ^) _ _ isWanZhengJu = true;
& z( F3 a! O6 v7 R. \5 j continue;
: y+ {- N5 i) @2 T4 m" ? } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
3 Y, e5 v% \$ s return false;
7 B, h; V4 z+ K6 g/ i% V }1 R* n1 t2 H3 l- ~- ^1 H* E
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的. w; o* @% S# y0 f
return false;( y9 X# a; I* l' s* C
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
9 D8 v/ q6 }3 \2 ]5 ?& h* C scene++;
0 B! z3 V* I2 E+ ?9 G8 t" g whichPlayer = scene % 2;
; f( m& L3 ]7 [/ V+ p index = i + 1;
% {3 ~# y) p) d, y7 N# t) n% Y9 D8 b7 g isWanZhengJu = true;" R) T& @1 P; U, V' e2 A6 E! J
continue;# G) y7 h: g) c9 o& A! ~
}7 Z; t( M* B4 F9 z1 L; ~' l
if (record == 10 && i != (record.length - 1)) { //下一个数分情况
) r- ?' B# ?0 p, [; A int[][] bsBak = new int[5][2];
, k# M, n+ p4 Z: x. T" t8 \ cpy2deepArr(bs, bsBak);5 U( _4 {+ P5 m5 Z8 e2 E0 r% w
if (check(i + 1, scene, playerIndex, record)) {" m; w- V$ E8 \0 [
cpy2deepArr(bsBak, bs);
# N* q8 T, q' {3 n: j( C if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
4 e& Q1 C! T/ s! x0 Z return false;, G5 K4 z! s. M C3 E) q7 K
}# x% h; ~& A) P3 Z# B* k! H
return numOfAbleJu < 2;/ e& W- n2 u' e% R
} else {$ t { {8 } L* b8 h% M) Q9 q
cpy2deepArr(bsBak, bs);
4 L1 E& E& X( o! w if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
4 a ]9 @3 ^1 T9 G7 _; G return numOfAbleJu < 2;
3 j, ^6 R+ p6 t$ `- q# x" ` }
2 a3 q. j. }: R9 w }8 `- ]# N$ C6 Z3 ~( T: b
return false;
6 X6 f9 r) z5 L }- ~! H1 I v0 f, v# l# ^
}
9 T6 T! G* t! g" ~8 k
Q1 h1 W# ?5 z$ K$ D! e+ q! e if (!isWanZhengJu) {
5 |5 o% I3 ` v+ ~ return false;
! y6 ]1 _6 M2 I" ~9 \ }) ?' `) ]' M/ t
// //检查是否符合五局三胜7 q: t, o' c c: |0 {
// int a = 0, b = 0;/ x! f2 K& x) V! Q; c
// for (int i = 0; i < bs.length; i++) { e; B9 k. ^! ]& n( V
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了( `# f6 T I) f% C ]
// break;
* _. `5 R* Q* Y// }
~( r Q0 _& v" F: _" X1 m( } N// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
9 ~+ E$ {: q) B' h! {// return false;( @' f7 h( m& E: h
// }3 p+ W, c/ j/ A5 ~/ I N2 R
// if (bs[0] > bs[1]) {- Z2 B- s1 u! D
// a++;& M7 c* Y8 x, t# j& r$ D( v
// } else {; v* u' N: O$ F' K2 V
// b++;
3 d6 K# f, I6 {$ z/ ?: y// }3 D) b) H% ~2 ~- Z/ K3 B- A* y
// }" ^0 c. {2 O }, Q% }
// if (a < 3 && b < 3) {//没有一个人得三局,故错误
8 Q9 `1 L' ]6 y* G, ]9 d5 L// return false;* a. N6 I$ m: _
// }
0 ]# m# _/ Q3 F" ^ //只要有三局及以上正常结果,则可视为OK
/ k! h; S- W. ?7 C9 ? int count = 0;
$ Q0 j( x% e% s+ g2 g8 s7 S5 _ for (int i = 0; i < bs.length; i++) {
" d4 P( T; C* F: H if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
7 s; j& O& ?! C break;
) G4 h( [- c' _; ?) \ }
2 z( O, y/ x9 N9 g$ j. A' \, ]9 v count++;; L9 V# h6 M) V, n8 _7 o
}& O" S! f$ I/ v9 l& ?
if (count < 3) {
3 w- p# }1 f' S7 K7 Y return false;/ W+ y/ Z* [3 W/ s y' k
}* u( F+ m" C4 r$ t! D( m: A
) a: L! r# G ?
numOfAbleJu += 1;0 ]! b/ `# A% v, l3 O
return true;
4 T4 B- ~2 I1 j }
, O/ \# ^, W- a) S1 T) g5 D- x! _" F private void cpy2deepArr(int[][] src, int[][] dest) {
8 X, S/ N1 F4 \( ?. |* @' Q5 N for (int i = 0; i < src.length; i++) {
- d2 W$ n' y" } for (int j = 0; j < src.length; j++) {! _: X- ^0 V; Y
dest[j] = src[j];% \' V# u. s5 v0 j( ^/ s7 l
}7 _; [8 G+ q/ o6 h: l* J2 m' k
}
) H5 ?0 _/ i6 p3 s. _$ ` }/ Q' v3 g0 V/ w3 v ]! }: ~
' u) a, h0 K9 U+ \( ?
public void printNowCheck() {
$ `4 E5 ]+ ]$ l' d* Q for (int i = 0; i < bs.length; i++) {# o3 Q; S* U) G0 ]' m
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了! ]+ ~# a( T" ^# o$ p
break;
0 I3 L8 o' K6 r% j. s, k; z8 s1 n }& V$ Z; Y9 Z1 ?2 B2 d. b9 w$ F
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
# {4 C7 z/ f" p& J2 K2 S& d( T! Y if (bs[0] > bs[1]) {2 V$ A* B a) \: g ?- a- M; `0 m$ L
System.out.println(bs[0] + ":" + bs[1]);
4 }, I2 I8 M8 d7 y7 z } else {' a9 L5 r" x$ M) T- ]) K( q
System.out.println(bs[1] + ":" + bs[0]);4 b* y, K# G$ b1 ?$ N8 @7 q% u
}3 V- u4 b5 z, H* a/ `+ e0 N6 e5 f
}0 e" d. n# a& _' f) @: X* M3 n
}* |& M- V, b% t* N
public void resetCheck() {9 Y1 H/ `7 D! A9 z+ M" M
for (int i = 0; i < bs.length; i++) {% q2 S: n0 q$ q {* O7 D, h
bs[0] = 0;. E' ~$ i- E2 T
bs[1] = 0;2 P3 m$ h6 H8 ]% \: U5 Q
}
' }: k! V. e% e }
' x: w5 c# c8 d' P+ q: X8 ~' { /**
; C) Y+ U0 |& I, `) z* j8 V * @param args( E* d- X9 t& a* L+ M! i
*/# r4 ]" u: R- k
public static void main(String[] args) {
! @ H* M4 i F // TODO Auto-generated method stub
1 P8 M0 [' g4 @$ w7 l W0 w# l* L! ] GouGouShiJiFen obj = new GouGouShiJiFen();* `: ~3 Z: ?$ o; b9 X
int[][] testData = {6 o# p) H: ^6 `4 y. S
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
+ d7 J" W J. x7 K& ^6 z8 Y {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},8 |# H- S% d& O' t# P% O. d* G5 h
{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}
$ k3 u0 J* Z1 C: S* H! ? };
[3 F) I, r& r for (int i = 0; i < testData.length; i++) {
3 u+ k; U; w6 }1 K if (obj.check(0, 0, 0, testData)) {
* I6 K/ c, p, I. u0 }' V obj.printNowCheck();
* w, [ S$ w# I9 y" g } else {
* l6 t* s8 P5 \) N" ? System.out.println("Unknown");$ t: D: w% Z6 l- G9 w9 ^1 A8 y
}
3 v8 T0 ~3 d2 E obj.resetCheck();
! c- r/ H7 z; }3 m3 m }
" J9 w) \6 \0 U. [8 k* x4 F }
) w: ]9 y! |$ J4 k/ b$ h4 A9 w$ f& Y7 G
} |