题目名称:蝈蝈式的记分
* p- V J. @/ s0 W9 K9 |
6 H( v/ U7 p- ?" X6 J! ^内容描述: , Q( o2 |1 q4 U8 Q
- @8 s5 x, Z: Q' e- |, R- @蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
. e* R- Y |0 l4 c, o: Y& V* t5 F
~: Q: U8 C N' E) |- o, B因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 2 O0 Y1 l5 ?9 L& ]
( X8 A8 u$ M% x* R) A
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 . s$ X2 b3 R+ L9 q" l3 v, l
0 \, `& s8 i7 ^9 b
输入数据: - e x2 n' x! @" E; n% K
6 {( x6 K- w4 w$ I5 u+ W以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 1 J0 n |/ x, p! R4 p' n
' J7 e* d7 x8 H0 C3 r1 [4 d输出数据:
) x+ w- y3 _/ c: T
1 T. M* F0 y8 y/ c) i相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
8 d( k8 _% D6 ~+ T: W! q# v, w# L! C$ w0 m
输入和输出结果数据样例:
7 s# J6 A9 E$ y2 c# l/ D, y% `6 }7 B0 R4 a7 `: `) W
输入样例 7 _& I) S1 H% g. F& Q6 J" R
( j3 z" Y, M: X3
+ u% b0 p# R, m, U6 ]5 ^4 M' p+ f. D' s. \: g% M7 ^" U/ Q
23
: z% f$ f; X8 l; R: C2 t g0 W6 \8 Y4 b. f& n! R5 R0 e4 y# w. L7 c2 \
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 9 w6 j" I# D) D: I, `. W$ a; b
9 t2 o) ^" H/ O5 P- C$ H+ I25
. g. t$ H1 C: d) s+ A) R; U9 |- D& x- L% K) Y8 P9 L
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
1 y* b2 G+ F! p' ?9 q+ B( O
+ ~% `1 ?) q" I# Z" K0 l3 Z43 / R9 w; k6 D" V9 X
/ j1 I2 j$ w w; |7 S3 O7 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
- A3 y% c. U2 k6 r, i
: ~* a: Y' u; m9 A$ m+ O# N* f* E( s9 p# R: T3 K! b, l
输出样例 ( v: p6 a/ c/ w) l1 O
2 m: H4 H3 r& R; S
21:17
2 `4 X3 ?" t5 J6 A( T
9 U) ?5 \2 |6 Q, n7 B+ P* d24:22
1 m$ {; i, B0 p! h& t, a
; z# h) V s* ?, n: V! [# n# t1 x2 J21:3 # c" N$ }: u+ c% R8 o
+ n! m6 M( M& P' T0 N
Unknown $ F. F1 M5 [: c) [" z5 ?, U
# q6 n( ]* M4 G+ [% i X. v% `
21:14 + T T) o- o' T- L1 j/ x
9 @. u( Y+ N! T( V20:22
+ P1 Z3 z. h# U! \: u! U
2 i# o5 L, N: `1 J6 h9 X21:23 5 n( l) E! `" J# C$ r
$ p' q" O/ V' r/ W! [21:16
5 I+ v. ^5 O0 j. \0 n: x5 F' V6 m0 M1 |, a
21:9 ) Z7 L4 n- S, F% Y( N
& b) h$ j/ `: c. l& [! x
+ h$ ?$ W2 m e! P kexample: public class GouGouShiJiFen {8 i; F4 r) G" U# t. \
: ~$ [* c! \ y: O& g+ ^) v
public int[][] bs = new int[5][2];//当前可能的比赛结果
9 \$ V$ M1 Y7 u. ^// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果5 V9 u J S. u( V
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
; l7 S& K3 D8 L: `$ S1 y// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
8 v& {3 s9 x% \& { public int numOfAbleJu = 0; //本行比赛可能的结果有几种8 y) J/ {5 j% z( Z
) C2 W8 v( ]" x# p0 [ /**2 P6 n( n- `4 j. `
* @param index 连续得失分的index
0 _" f8 Y5 }2 Y2 a * @param scene 第几局比赛* k0 T7 ]1 {% `* T# `; M- r
* @param whichPlayer index处分为哪个选手得分, y. i& s8 ^" [! y! S: t1 [& H; Z
* @param record GuoGuo记的一行分& R* M0 u7 m! [% U9 d
* @return 是否是一种可能的比赛结果
5 l6 j; L. {& I! p- A& }- d */+ Z# H2 ]3 `2 ?& o0 C% g
public boolean check(int index, int scene, int whichPlayer, int[] record) {
+ @7 r% O6 h- d) Z9 V. \ int playerIndex = whichPlayer;2 X- K/ \6 \; ^6 C
boolean isWanZhengJu = false;4 A/ e0 [: h# I X* o
for (int i = index; i < record.length; i++) {
# @$ ?/ R! g* } isWanZhengJu = false;7 o5 b$ F5 u4 ^$ o1 s
playerIndex = (whichPlayer + i - index) % 2;
! e) J; z$ r) q3 l, e5 ^4 M: g1 F' } bs[scene][playerIndex] += record;& H5 E6 ]& T- i
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
5 q2 M1 L: K4 I# H4 ^/ S if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束2 j1 W; L* R; M1 Z* i# X
scene++;6 \. [2 N0 o5 H0 w$ }, Z# S; X
whichPlayer = scene % 2;
1 v1 ~4 B4 ]5 {3 x" Z7 C index = i + 1;0 a; ^1 B& C% i5 J0 y I" V
isWanZhengJu = true;
8 Q) N) Z7 Z, f, q- [1 k" v continue;
% n, \% ~% @/ r" I l7 y% G+ M" m } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的9 g0 T5 Z* T/ s8 D$ }
return false;
! m! ]# Y' C, B h }
8 ~$ N0 A! I7 U5 f } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的3 E" Z, Y" |4 r) k8 n
return false;
, |; d4 V. g+ c& z3 R' y7 U# }; ] } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
* j+ h% ?* e% _9 k8 w: l; D" a- x5 r scene++;
! K5 W8 \. T3 `4 I- R( g1 s whichPlayer = scene % 2;
) L, p0 N" L% W6 h/ o index = i + 1;
, M1 R% h. p! C/ S- u isWanZhengJu = true;( h# c/ v7 C, ~, P H- ]* E( {
continue;' N$ n4 a* B) d- ]- d
}/ k4 @0 C% x3 i3 P1 G
if (record == 10 && i != (record.length - 1)) { //下一个数分情况1 U) d, F7 J7 `/ n* B
int[][] bsBak = new int[5][2];* \( M. G+ D4 C7 Q
cpy2deepArr(bs, bsBak);
* g" f% G: L) y( h" E if (check(i + 1, scene, playerIndex, record)) {
+ q: ~8 B# {7 B4 u) @2 W4 U3 J cpy2deepArr(bsBak, bs);% w2 k* l+ B% Z: l& A/ n
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
) T8 M, B0 d" |/ Y return false;2 z8 T* D- h3 A+ p
}
r* n) H/ z) a( S1 |& n+ H return numOfAbleJu < 2;
' q$ ?6 L# [6 F# f4 } } else {
/ U/ E9 |2 H; u# x cpy2deepArr(bsBak, bs);1 |5 [0 k/ E/ L3 ^: Y Q
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {3 }6 p4 m% A5 W! _6 j$ M7 b
return numOfAbleJu < 2;! T2 F; F) O" ?" {$ j
}- P6 ~4 j, a4 U
}
# n$ |% P% V0 U7 k3 @; ^* _+ I3 E! ~ return false;5 k, b5 Y3 R6 ^# K
}
) P5 N9 S) E) m, x$ J$ z+ v# L }0 ^% D3 ?; x' D" g
( g# r4 r, c2 G* a
if (!isWanZhengJu) {
; x( `8 m2 z0 @& h' K return false;
) I4 \) ]- ?/ R( s- ^9 z$ F1 C }
, \% L- O: W6 l. N! q1 g( G// //检查是否符合五局三胜
7 O% I2 ~7 R% ^- P// int a = 0, b = 0;
) X- i; m% N) I6 J// for (int i = 0; i < bs.length; i++) {
# \) V; b6 D! l5 H! P5 s// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了4 o1 l/ u' c0 L# v# [; r4 F& `
// break;) A6 F5 J7 a$ ] |
// }
0 i7 J& I5 ?1 O// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制 w1 u$ n$ y. A" k6 ^# L& p
// return false;8 R1 w+ n3 n& H7 e- r& S
// }
5 W; c: j% O* p. u) p& J' ]// if (bs[0] > bs[1]) {
+ N5 t/ V$ Z: G: g( j// a++;; ?3 k3 S# j6 t# Y. w9 U
// } else {0 e6 {) Q. A. o: y0 w" a
// b++;, H1 J4 [' C) j# y
// }9 l: H% O" A1 j# H0 X; e) x
// }
P& d1 h, r* \# f0 `/ m// if (a < 3 && b < 3) {//没有一个人得三局,故错误
; h- O, J* S" \. }// return false;
$ _, k2 v( G) j E: i2 Q// }1 J" V/ H' U2 a$ Y1 Q5 L) M% H
//只要有三局及以上正常结果,则可视为OK; W ?2 U/ W# {$ k/ y
int count = 0;! f- T% E, ^) R! u# g2 g
for (int i = 0; i < bs.length; i++) {) f7 X* b. Z% `6 a6 `, e
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了) ^( Q/ H) p; P, U5 x. E [
break; ?* d4 C' N% J. {
}3 [. r- S. [7 ^/ j8 F! j
count++;
- P c$ `+ p* Z# U, g }9 k0 u- P& y# o
if (count < 3) {; z# D; n( r5 B6 o+ H3 F
return false;
V* B1 {6 ?8 m7 d8 C }& ]& P; V6 b) d. K# U8 \
1 {& w {9 [% a4 J% [* n
numOfAbleJu += 1;; A: W- z- p- b2 L
return true;4 x* D8 w1 I" L# ]. V; `
}
9 O/ Z) b& u# \$ e private void cpy2deepArr(int[][] src, int[][] dest) {
% k k6 B8 e2 i% _* A$ j for (int i = 0; i < src.length; i++) {5 ^, @' g( E$ w$ B, R- d+ w
for (int j = 0; j < src.length; j++) {
0 k! x$ r- u9 V1 h7 f2 S! p' Z dest[j] = src[j];5 W. S# J" M8 a. I
}
1 k# l/ ~7 i8 P) D: F }
* \( R( b) Z4 k" Z }
2 K& d! ?' @0 P. [3 T6 i
W1 ~' F& l! D5 J public void printNowCheck() {* J9 t0 x3 Q0 V4 R6 H+ D
for (int i = 0; i < bs.length; i++) {
2 a/ E- `; y" n$ z; D/ J if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
' Y5 H M* z' L8 T break;
( J5 w* k1 G: C8 R' q: c }
3 U! U1 ~3 h. i( z. |1 D$ ^+ ] //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出1 A4 t/ J" T' x! I1 S7 w- h3 J
if (bs[0] > bs[1]) {
) P( o% b. c, t h* W System.out.println(bs[0] + ":" + bs[1]);6 G2 O- C+ v& f
} else {5 v, d* L" j7 X: a/ R1 g1 {" t. l
System.out.println(bs[1] + ":" + bs[0]);0 g* f/ X( m9 v. ]& S" V# a
}
5 E+ z8 ~% [, X _/ {" s4 v5 w }( a, }/ A8 Y& N8 ]
}5 K" _( _. e/ ~/ k+ `
public void resetCheck() {; h, l9 N6 y1 z) e- R/ v: g
for (int i = 0; i < bs.length; i++) {) D0 G% k. E- S) ?. w- B; y& E% i
bs[0] = 0;7 v- y# A& b1 h5 x |5 h
bs[1] = 0;
3 t; k' e# l( H5 U }$ Y1 c2 A3 ?' z( H, l2 |
}% {4 A3 v/ d/ e! N; h7 [; }4 ?0 a
/**
7 Y4 N, V. l/ ^: I% A * @param args
; a. }0 A% U; ~& S' Z$ ]/ E3 J */
0 a2 l0 U, P+ D- m: d$ u% i public static void main(String[] args) {( [) g: w# m! C! N
// TODO Auto-generated method stub
6 W5 j5 @# w5 L# N2 v4 z GouGouShiJiFen obj = new GouGouShiJiFen();
+ b" K- c e) b) k( N int[][] testData = {
" ^# I5 s( F( @' y! L ?! [9 p {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
7 t6 u+ G5 L) |) J# {# c4 Y, X {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},; p; Y: n8 Z) t0 O9 x+ s
{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}0 B9 O! E- C; @/ j/ f
};9 r8 s; K1 _4 @; r
for (int i = 0; i < testData.length; i++) {! ^2 O a, ?- j9 e
if (obj.check(0, 0, 0, testData)) { [) @' H k- @9 d I' I- @
obj.printNowCheck();
' ]+ a& Y% }3 U7 ^ } else {
( e8 B* H u% @& @4 B- k/ w System.out.println("Unknown");
5 K- Q9 l, g$ E1 b* H }4 R6 G7 @1 n& Q. }3 j
obj.resetCheck();6 a7 }$ L" s' P0 b- b p5 ^
}
7 q, k h! d4 M6 h4 h- Z, Y }: ?9 O9 ]& ~- I6 u6 |
+ `1 g' `+ p$ T+ J& K/ q} |