题目名称:蝈蝈式的记分
- J K8 _8 V! T& Q8 D! S0 g/ F
9 ^/ a7 L8 ?+ X& N, C% C内容描述: 8 G+ I" z+ n+ ?" v! Y
9 z/ L+ ^$ Q1 C* K1 T蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
- v& X6 z, a2 N) p d
# _+ ~6 v$ o% @9 n2 N因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 $ Z3 q. M8 k! k. h( t. H2 b/ ~0 \0 d
: k: E) v0 g/ r5 _
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
2 U! j3 l8 B) _& |" Z& G, Q' g" a- k3 h: K
输入数据:
% {# k* g' z3 \2 Z; T5 _+ {- ~: i) c% Y
$ Z1 h3 D6 j; P% K! @7 w1 t以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
9 T2 N( {' S. o7 Z* h! x O7 G' o, A9 c& E
输出数据:
8 V4 }5 l& ]/ _2 e' V! O- m* Y% T) ]. H {: s
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
# @2 h; `% {- n. n0 J
- c& ?- S' P, D# j+ v; }输入和输出结果数据样例:
# I( w* x# C* t' u: ^8 W8 D0 D- f% Q0 `$ R( w
输入样例 + ~0 t6 E3 ?! J+ N! ?! A0 r
4 [2 ?% B8 ]0 o: o# j1 `8 i) l: V
3
4 h7 `) e( d( c4 u' I& {2 e" E8 r& n' e; E6 a p
23
7 w$ K* ?- o$ G- g% Y! b& A5 Y5 P4 @0 f3 H6 B2 V
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
/ P- L% T; y2 [4 V+ J9 N
! {" Q1 N+ ]$ L4 L" M( {+ R25
- `' | [2 P1 {6 }$ e( y! e g7 [8 y9 Y1 Z7 }2 i/ I6 @
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 ) S8 X, K3 a. j
6 s& d2 g `5 s
43
; H# n1 N* e; V9 X: F6 e, a4 _
8 z. n. Q1 V9 H: H+ n7 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
' M; N+ l3 S% @9 F- w
: I3 ~$ c2 O/ e& @$ o
. I1 b, I# w! g$ L输出样例 3 R. E ~9 W+ ~' B1 P
1 ^2 o( r" P& Z7 e, ~, Y
21:17 3 E N' M2 r; G0 c/ M: D
( y( C# J b7 F1 r& ~1 X$ ^" Z
24:22
( O0 c" ]" L3 Y+ A; R/ g) ?
" \1 |* d4 ?1 c% b21:3 - U, O! O5 R) a& ^9 w/ C3 z2 R
, n6 u6 I% S0 U% q3 o( j
Unknown ' X4 F" l O9 m/ J
; e7 z) u* I( f3 J2 P* b/ Y
21:14 m" ~4 _8 p5 ?7 y/ V0 L* G8 A/ R+ n7 W
* e2 x) w/ i# u& l k3 p9 a20:22 # B2 I$ p1 l) e: g: Q7 K& i
7 S5 w( ]" W5 m9 p; @) z a" j21:23
( K3 S0 k/ W: Y9 y, W& G, [; t+ o1 e. k/ e* d( v2 z7 C! ^
21:16
7 A0 N6 l, g0 ]( Q# N, l, t' C0 ^* ~, d4 n% U( X
21:9 * V( ]4 r- k$ e
7 J0 B- }% C- K% A
3 ^6 _, |# D. Q/ d: yexample: public class GouGouShiJiFen {
3 n9 y5 K/ n# X9 ~
4 z. s+ C( F9 B public int[][] bs = new int[5][2];//当前可能的比赛结果9 G, V+ D8 N4 G- Y
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
4 e) S- r1 v7 |% \. i, P) u// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份 h. S3 g, b0 P4 s
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
3 `) p3 N+ r3 M: a6 k public int numOfAbleJu = 0; //本行比赛可能的结果有几种 M7 f! P$ c3 D( P$ b; O9 _9 b
3 |" I3 |: c5 K /**
0 Q. q4 V2 {1 X * @param index 连续得失分的index
0 t3 u! F( `# }- |' B * @param scene 第几局比赛0 A( T o6 H2 h7 k+ n9 i9 |/ w9 Z! O, P8 i
* @param whichPlayer index处分为哪个选手得分3 @4 U5 Y! T) A3 @0 H- e
* @param record GuoGuo记的一行分4 L1 _& x3 B* o- H+ I
* @return 是否是一种可能的比赛结果
& x8 ^! F2 F2 `% v4 S+ ]2 v- u, f- g */
3 L0 X; N+ P3 ?7 P5 k! P public boolean check(int index, int scene, int whichPlayer, int[] record) {
1 c- k- e: W6 x int playerIndex = whichPlayer;5 V# J6 m0 L% E9 i |. B
boolean isWanZhengJu = false;
0 z8 E H. S4 f, j- w for (int i = index; i < record.length; i++) {& c; F4 ^( U$ I$ y" G6 }5 f# b* U
isWanZhengJu = false;
( {: p4 ^! ` V( _ playerIndex = (whichPlayer + i - index) % 2;4 P7 T, g! P- R
bs[scene][playerIndex] += record;
V* X9 J8 Q6 l. B( _2 Q& v if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局; C5 l. p- p7 M" j' P5 \% F
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束4 H1 `+ L W6 t$ D! A0 T6 _! @
scene++;
( J% o+ w! K- @* f, | whichPlayer = scene % 2;
g0 j" |" R: ~' n index = i + 1;% t, C" z2 S C. M- O _* {! n
isWanZhengJu = true;8 k0 p* |: d, u. N
continue;
& {3 p0 K, P5 t6 ^+ e( ? } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的! T5 w. h" W) B3 |/ X- V" V
return false;- s: L# d5 f4 d# b! H
}
; o" J v3 J9 l$ v& f. ?7 f! b } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的* f6 j' Y3 i9 K& p8 q Y
return false;
: t( ?7 Z! s( r4 @ L/ c6 f7 Y } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束 _& r; S2 J1 o3 @
scene++;
0 H5 J3 D8 O% F: m, J7 I( A whichPlayer = scene % 2;8 e2 k( [/ m: @. Y! a: D
index = i + 1;
$ ]( ?) N! _! C isWanZhengJu = true;
7 R) F p: X$ @+ G. Z9 L continue;; e8 t- _/ f3 v( k
}
( r" W) J R0 u2 Y7 O0 @ if (record == 10 && i != (record.length - 1)) { //下一个数分情况
/ M$ K9 h% ?$ R2 s& [' _& b# x int[][] bsBak = new int[5][2];
, x# H/ f5 u( b! D' b# m3 } cpy2deepArr(bs, bsBak);
- H8 }" D- o: R$ M if (check(i + 1, scene, playerIndex, record)) {
: ?2 s8 x1 u5 y/ ~1 x cpy2deepArr(bsBak, bs);
' I1 g# x0 f. p. I- c& n if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
; M: T9 {: Z% F# U) Z return false;
4 S& {4 S) G! Y4 S } ~: q- b1 u# J* z) }
return numOfAbleJu < 2;
" r( N6 M6 @# @8 c: j7 ]+ W } else {
- [: J( t# K' ? ? cpy2deepArr(bsBak, bs);, a/ N0 G; k; _3 r" a! @, v
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {$ i; F3 H# F1 O2 Y! \( b
return numOfAbleJu < 2;$ b5 s# k, ^9 [8 _# Q; n# t% H9 `
}
! T( h: x b2 m+ b }4 d# ]* r W% Z7 c" v4 Q7 `! \
return false;
9 Z0 S9 t+ R# f5 W$ y; k }+ d7 d( s5 ~" @9 k+ n+ k P
}
0 H; J6 H6 a) \/ W* ]3 B 4 G' y; c ^! N ]
if (!isWanZhengJu) {
- o/ p. M, X; x return false;$ C9 P* s6 Y. j. h, S) G8 }4 d
}: I8 m% N, L. k1 E9 p4 _0 z
// //检查是否符合五局三胜: {7 y( Y8 ~' z# e) `; w
// int a = 0, b = 0;/ |$ I- n9 R- R' A8 u
// for (int i = 0; i < bs.length; i++) {
, B8 D- f) y( A! Q8 `: T) T// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了2 c, R' W8 V1 I I0 X1 B
// break;
* m/ N0 V# `, ^6 K5 i' L1 p* y// }/ ?$ R# y$ }! l+ O0 f# g: Y2 W$ [; z
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制, r( i1 i! g1 v+ I3 o9 A) h) T1 G
// return false; M/ I- ~; z+ l6 r. C8 z- m
// }; Q! U8 _2 |! B
// if (bs[0] > bs[1]) {( j6 ^5 ^5 L3 Y
// a++;
6 y4 I( h& f/ |6 q, s2 S3 ~: P// } else {
9 n# \4 z5 }% ^7 i. |7 r3 [// b++;
; f' H" e! K c// }- l9 I% C5 B/ n2 @- N
// }) G% F$ }+ X" ?' \9 W; I4 e
// if (a < 3 && b < 3) {//没有一个人得三局,故错误" ^8 j7 r* i1 i0 w
// return false;
8 E8 k1 ~! S% Y' f7 J// }% r5 j0 b6 b# ^7 k) X
//只要有三局及以上正常结果,则可视为OK
7 k. s* | s" J7 @) g, G int count = 0;0 x* P% |3 f: Y1 _0 T. ]. O
for (int i = 0; i < bs.length; i++) {. Q7 [, r: c1 R" ?7 M! Y O" i
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
6 [: \* I* c4 C; Y+ m break;! t: k8 b( w: ~: R+ ~/ b
}! N7 s' K4 {( p7 {, G6 c
count++;2 p$ k0 f' c ^" Q i
}) w, f M8 M4 o, O: C1 Z
if (count < 3) {3 Z4 u+ ^8 p5 R x* d
return false;* X L+ g$ [% i+ C1 N
}* `5 M9 z! G& Q- A
5 [3 K8 e$ l0 ?% T, A7 h+ m5 W numOfAbleJu += 1;& P: e$ P4 A1 _# O$ N
return true;3 H/ _, ^' G* b$ _# [4 u
}# ^+ Q% V1 W/ T+ a
private void cpy2deepArr(int[][] src, int[][] dest) {: z1 a0 r' Y F# a; R# C ~
for (int i = 0; i < src.length; i++) {
& J M. M6 H/ j/ |5 ~ for (int j = 0; j < src.length; j++) {
6 C% l) U4 y, x9 e" \ dest[j] = src[j];
$ ]8 A* I1 D6 t2 b- a. h }0 l% a- [/ h/ M& ?8 ^+ w/ x
}
/ I3 x) D* ?2 _% Z+ w5 f }7 G2 r# ~& j8 I% [
& R' [' i; r; f3 B+ u( L; P, F: ^0 Y public void printNowCheck() {
" {. d) s; \* j* L( A5 P; S/ U for (int i = 0; i < bs.length; i++) {
7 I2 c2 G8 E! c9 s( v) a: w# N if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
1 p1 e& K) @2 b8 l break;
h6 n( a# Z, c! s$ o( }" ^& E }
4 `; D1 G m6 U: f6 Y' U6 j1 G- b //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出5 O7 k5 _- z$ x/ }5 o) l
if (bs[0] > bs[1]) {
' \1 J2 g2 i4 H- g0 Q8 r System.out.println(bs[0] + ":" + bs[1]);3 G& W+ r9 I2 o5 E6 t! E6 o0 ^
} else {( T0 ?0 y1 X0 A `; b( d2 H, M
System.out.println(bs[1] + ":" + bs[0]);
; a* O3 C: _# z1 j j }
# o: k8 f$ E2 K# Q. o4 d6 K& M }
/ S2 [+ X, I" \- ^# g' q+ [, _ }' d) a9 g% {9 v
public void resetCheck() {8 V \( y8 O- N7 [
for (int i = 0; i < bs.length; i++) {" o" R6 z8 N, D# t6 s. M
bs[0] = 0;& N% b2 V0 `' A& j1 J
bs[1] = 0;
) j# }2 u) \& Z) T }" [- j+ K) }2 {- w- M4 |2 `
}
6 g' V' \9 H4 q3 M8 j- v! d: {0 } /**
* q" p4 y$ [6 U4 u @1 r$ a% c$ g( g * @param args! F. }& P. p% U8 n, M! C5 g' R
*/
8 [- k9 ]2 u! q public static void main(String[] args) {" {4 Y. l f- p2 F9 |, e+ h
// TODO Auto-generated method stub3 {5 k2 f9 P5 l( m0 E0 \
GouGouShiJiFen obj = new GouGouShiJiFen();: [, Z) M0 G. ~
int[][] testData = {
6 }: v( ]# j# R; Z* _: C" }- E* Z {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},7 H# D$ g: V' p y5 m [' ~+ V" 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},
( I, n n9 Z% ~9 L, D1 Q {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 b$ j9 [/ C* X* x
};/ }( o8 L! P. _6 _# N7 p+ Z
for (int i = 0; i < testData.length; i++) {
% r. l; R, W4 T, ] if (obj.check(0, 0, 0, testData)) {8 ^8 f8 ^; z: l) |3 ]" w
obj.printNowCheck();
i3 H" n+ L [# w } else {
5 @6 Q5 ~7 ~# x, E" Y$ [ System.out.println("Unknown");6 {, _0 d) D7 h0 M
}. |' i3 I+ G5 P; {- P5 _; x
obj.resetCheck();- j' F. m, z, V% I
}
3 h9 Q- Y4 t5 `2 D/ j( \7 U% n } F8 _! T/ M, h
3 j: k4 C( F0 w- I4 A, z& j3 U
} |