题目名称:蝈蝈式的记分
- ?5 ^8 N+ Z1 g( V9 Y8 @% Q4 A# ~% C, P- V' _) Q
内容描述:
. l! n; W. u* g1 {; }5 ?, c( W' F- T. ]$ L
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
/ ^! T* i; X V1 G2 M" R" g
! e9 }* q% J+ }因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
! i* j9 B$ v) c& W' Z+ _( P B/ Z$ W0 B( P
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
# e# x% @; @( K+ U. U
4 L- f3 r4 |9 U* \输入数据:
. ?5 m. b% l) N( y0 P
+ X, q, U6 r0 E( A' D/ P8 o以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 ( Y: ^: ]' s1 g% S( x) A
& r+ V6 e' b" M
输出数据: 7 f) i6 e- x: b8 j, F
' [) e0 c" k7 n& H. ^( Q E相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
" n3 y, [4 a! D. q: n3 b6 R7 t; {4 ~. `9 F" B$ J! K
输入和输出结果数据样例: $ y9 |+ p5 |9 M: w1 @; m
% b/ m* D* O0 T/ K输入样例 : `, g- }" f9 K2 O5 n( c. S3 F# a" `
% [" ] g# d2 n
3 * |" }. i1 z' Z, e. ?
5 l A) p9 D& S5 N) N, F0 D, s23 . k6 c# {( i) N7 F6 V: q& N9 v
- I# Q+ x) a. _, Z
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
* j8 S; o5 D# w1 t6 X# s; Y+ L+ s3 {% k1 a- g
25
x2 Z$ m3 H I% l+ a1 i; g9 ]# s& c9 _ J
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 - ^' j( X' P. L! @4 q* F% A
9 \. w' R0 R; |1 r3 ?43 2 O" p2 k0 n4 X) d. j# V
9 s& _. I+ x! C. A& 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
: \. b- R2 q0 E6 N, B
3 E$ S, f. i0 ^3 ]# C) X7 U
; r# x. ~5 t# a7 j( s3 P1 z* D, s" D输出样例
' S% _% v9 k6 X* I3 t2 N0 {) X
3 u0 M7 D) s* T% h21:17
6 Q: p$ S: k: |# O6 g! a* C6 w" W' _9 G' K3 }
24:22
4 F x& D, m" O; D5 j% p2 j3 Y- A6 a1 `* o0 o2 }; g) I: Q
21:3 & K. N1 O! @0 h8 w1 \
6 A! E5 z& _- ~# C& HUnknown
! h; b$ J* Z+ \% H& m, n# m: o& N1 A7 o6 i! @2 c6 B
21:14 : }2 y z7 o5 n4 d3 G( W
4 g/ `: s$ p. _1 v0 B$ }# S
20:22
$ U5 `; d* [* D$ n; R6 q6 ^/ @/ i4 L; T) ~* E% I) }* _' Q; D% k
21:23 % c* S, Q4 C4 S! G$ ^. }& U
$ u5 Y1 D. u- T21:16
, t& ]* h# `0 y7 r6 i: X* j" H6 o" ~7 X) c y S* X# j8 g
21:9
: G0 P' u7 G$ {( k N ( d& M; R% m* M0 O0 ?
' e. C) }3 f; K8 `# ^example: public class GouGouShiJiFen {
# K8 l' N+ s1 ]! d' g5 Z" a$ }2 ^
public int[][] bs = new int[5][2];//当前可能的比赛结果# Z( p4 H) h) d2 S
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
: x' ~' d" A( L* B! |: z% M+ u& f1 k// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
% E( z. Z" ]& u/ z* h% d// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
8 O) ]% l( g6 _2 U; e public int numOfAbleJu = 0; //本行比赛可能的结果有几种
A' N" G& z1 d0 ~ * Y; w- I$ ?! H' U
/**
6 f8 R7 B/ v0 O, @ * @param index 连续得失分的index; y* E% U l& I0 ?7 o2 t
* @param scene 第几局比赛+ O3 p. Y5 k$ O( r* A
* @param whichPlayer index处分为哪个选手得分
( k# A I6 n1 d* d+ h9 h6 f * @param record GuoGuo记的一行分+ B" U2 Y @2 I9 B+ J
* @return 是否是一种可能的比赛结果0 j/ ~, t; ~- Y- I
*/& U7 `4 u Y* y0 G4 S, I
public boolean check(int index, int scene, int whichPlayer, int[] record) {
# z2 y5 @: [3 u, B int playerIndex = whichPlayer;
3 d3 z2 X& R/ [) P: M6 I' l! [ boolean isWanZhengJu = false;
) e/ G- o7 x* u& ~; M h9 ^5 F for (int i = index; i < record.length; i++) {# k5 ?& g6 X9 i. H$ I2 y1 i
isWanZhengJu = false;9 H) ?8 T: h* g
playerIndex = (whichPlayer + i - index) % 2; O& `4 V; u% k X" r* o
bs[scene][playerIndex] += record;
, ]% H& b% W2 I4 p! B' E) q+ I if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
5 j; K$ x" f4 w; ~+ \8 L& ]# k' s if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
2 Q" F7 L. q/ s3 j9 Z" F; N scene++;+ x0 E, o6 \& m2 C( R8 X, o8 Z
whichPlayer = scene % 2;
0 e. H* t! E! I0 j6 S D/ g index = i + 1;( P. a1 v7 K! Y* _1 J
isWanZhengJu = true;7 Z) T2 W7 q! O- W
continue;, B3 p' t! J8 p) J# f" t7 Q: |
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的. f+ t9 E& i! |0 b+ U1 h
return false;
+ A$ P. J2 `) e' \9 W/ Y+ D }
# l# {) D' L B0 E1 V% ~/ ~ } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
& \9 S$ G Y/ g& X return false;- Z8 q, }0 r! M) g$ r' i4 ~# Y
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束6 c; R8 v* T% ?# [! k
scene++;- R. Z4 q6 Y/ c" f5 m) R2 i
whichPlayer = scene % 2;% o! J# G% c: t9 { c6 q- f
index = i + 1;9 G& `" f0 `. Y0 h. w
isWanZhengJu = true;9 M% [1 J) t6 y) b G8 r
continue;( g6 _. C) a$ O3 E/ D
}
% c/ p4 F) r6 Q- u. S8 G! i if (record == 10 && i != (record.length - 1)) { //下一个数分情况; j& |% \5 x7 C; D5 |% n
int[][] bsBak = new int[5][2];
/ d, t3 C/ F( s' _" @' S" V cpy2deepArr(bs, bsBak);% i3 }1 n$ T6 h, I7 i
if (check(i + 1, scene, playerIndex, record)) { y( j6 m' B* b1 E9 @1 z& V' J1 g. b f
cpy2deepArr(bsBak, bs);6 l, ^! z k/ ~6 k" l" m c c
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误4 f- p5 t0 _, b6 g7 Q% y
return false;+ m* M& v1 F I0 b
}- s5 |/ X1 N2 D5 k! F$ o9 k7 W% S1 c
return numOfAbleJu < 2;
# y: K: O" |; _1 I3 \& m7 k" K } else {
& d) n% |/ T) ~( @ cpy2deepArr(bsBak, bs);
: L$ m2 ]- c0 S8 a% V3 m/ M( D if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
7 W3 K7 Z$ w/ v6 R* b$ g+ \7 n* h return numOfAbleJu < 2;
& g1 ?% e6 N' \ }, }' w8 \% k' i
}
3 {5 P' Y1 d/ h- N( A. d4 F' f9 ? return false;
, Y4 z2 s0 }. C' \( M5 _ }
, `+ R9 W# K4 `; x# \1 u, q* f8 z }
0 t$ N i4 T, T# l4 x5 {( { v; B 9 T' _. j6 c2 p
if (!isWanZhengJu) {
+ l* K2 ]* T2 O" b9 w7 A6 U return false;% c H O, f4 A! ?- ~& j N6 V
}
{; V7 r* q4 N& W2 k. Z( P5 a7 e// //检查是否符合五局三胜
1 b4 e5 Z5 C) e C9 P// int a = 0, b = 0;4 D4 m1 \1 \4 n8 q2 R! X
// for (int i = 0; i < bs.length; i++) {
" _ ~# | k9 ~$ t* _0 G% B// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
4 O* ~& @4 D" W) f8 J! f. K3 k// break;3 t$ z7 W R9 T6 G
// }2 Z4 O/ G2 j+ @+ F+ x5 B
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
: l; M& c. o% W- V' U( ^$ V9 }( V// return false;$ d0 ], `$ @. \6 Z3 }9 `' i% M
// }
1 U& T5 {' P# e2 U* x/ \$ D% G// if (bs[0] > bs[1]) {, D2 H0 [) ] X; a
// a++;) r: m+ q+ o$ r
// } else {/ [: C6 u6 d) N. B( C4 ~
// b++;
7 \) U' R) N! D! Y// }
; b8 L$ d. F! h# x// }' G- L* b( a. {7 ]
// if (a < 3 && b < 3) {//没有一个人得三局,故错误
9 \3 L3 m H, R// return false;. V; V" j; h1 u
// }3 D: x* m3 \8 l' y- H1 s/ v
//只要有三局及以上正常结果,则可视为OK* }% Y9 i1 K- H% L9 m0 r
int count = 0;. J, {' G( ]% I
for (int i = 0; i < bs.length; i++) {
7 E, S7 @& \3 N" D9 P0 j" L/ M if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了( P; v" R+ e" [1 e8 s8 e% a
break;6 [. q8 P, f% v0 B2 c6 P
}, w" e. f; X; @" B. j
count++;! Y& k6 C% a! t2 e7 Z
}. f8 S' I, Y! f8 v2 t+ _2 B8 b
if (count < 3) {4 R4 O; ~4 a' h7 E( G$ e' [
return false;
6 p. l2 B ^# j0 a2 b/ c" Z }
) M! s9 _! y; h1 R$ ` * X0 k* V+ ?) G# u" g/ |: a/ O O
numOfAbleJu += 1;5 P7 C. C6 h( j. w0 Y$ S4 B* U, K" a8 R
return true;. r. n5 Z* F' y1 i2 J5 E& ?4 s
}
9 X' t% q& U% p. Q0 M4 P9 V! N private void cpy2deepArr(int[][] src, int[][] dest) {
4 ?' o; q2 Z& S% X$ w, r& @ for (int i = 0; i < src.length; i++) {
( i. L2 g& r3 L% E$ @: \ for (int j = 0; j < src.length; j++) {
; d+ |8 o h$ R% L Z8 E dest[j] = src[j];
& ?- J8 v+ Y% @+ F; ^" b }9 }" Y, a+ n/ {4 L: b3 Z
}
- e: J$ z# j/ A2 ^ }) Y2 a7 e: W" u% j2 }; R+ |1 t: A
+ X4 e/ h% |& L4 E" K i$ Z$ y
public void printNowCheck() {
* W, `* b2 F8 H for (int i = 0; i < bs.length; i++) {' U2 U2 \4 @# h
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
- @! }% X0 C S9 U. H { break;& O$ Y9 U% O1 D3 t- ^" n& @
}1 \1 E3 o6 i# g& c
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出' E: B' _: n6 A$ G8 W
if (bs[0] > bs[1]) {6 b- P* H9 r/ \$ V
System.out.println(bs[0] + ":" + bs[1]);- l8 C* S3 ^7 p( r
} else { K3 r: M. g* S8 n& R/ X/ ?
System.out.println(bs[1] + ":" + bs[0]);+ O7 o6 n @. [, k6 G( _
}
; h, Q: A5 i9 V1 H, z: k2 \. I }) g, @4 m l7 a! b7 `- A
}- L# [7 c7 x m6 C5 o
public void resetCheck() {
& O! \. v1 [7 M* y6 | for (int i = 0; i < bs.length; i++) {
! R1 Q$ M1 E. O8 p" a" n. A bs[0] = 0;& E% [ [+ b+ q4 ]
bs[1] = 0;4 e/ [2 K1 Y2 c5 p! M
}! m$ L! C8 l% J% l" |
}
2 q3 A) L$ L8 v) z0 @ q- v) ?% Z; F% | /**' K7 L& ^$ H! P1 \
* @param args
+ ~2 `9 w5 J. e$ @5 T5 X0 R */8 v% `* G7 \/ c
public static void main(String[] args) {4 M9 ^4 ?$ [( z$ X
// TODO Auto-generated method stub' l% u) v6 u/ y! v- d3 Q* h
GouGouShiJiFen obj = new GouGouShiJiFen(); Q& {; K, D; _2 i0 d8 v6 n8 p
int[][] testData = {- O" t- [3 ? I
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},6 Q$ z+ k# i/ C- z
{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) {' _- Y' y8 g6 u7 Y* a
{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}
9 r0 [) k3 _$ R! E& R) B% n };
! h$ L0 H# f: Z, ^2 ^8 N: b for (int i = 0; i < testData.length; i++) {
3 E E. t7 C( n/ c if (obj.check(0, 0, 0, testData)) {* r3 g; G3 _& \/ K
obj.printNowCheck();- y$ o8 J! M0 B7 ^2 s B+ T: X
} else {! O! i. j1 o6 [9 A6 a
System.out.println("Unknown");0 l6 T; i6 v4 D- K
}, h5 y& F. }" R: q' i( X
obj.resetCheck();
+ `2 ~. f8 F/ X. Z7 d9 I' O }
, r, d4 J. ?" A# j }3 f w- i' i, E5 P
5 \( ]5 Y8 H+ y( P& r
} |