题目名称:蝈蝈式的记分 0 w$ K4 v1 X5 Y) k0 I& }
3 n( {' z5 @. O( e [5 [1 S内容描述:
$ s) r/ I1 w( p) G O. |
. |& y$ W9 S3 G4 l; G0 H7 o/ B蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 7 A7 t" W& ~; n
. G7 x/ b) G B3 E3 I ^2 M因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 / u6 s) h g8 F( h2 _( v' V
1 x5 ?6 y5 ^) r需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
7 T3 L: T- b1 |( H) e" [2 \. Y. D
- ^* m0 N5 P3 ^, Z, ~- n E输入数据:
W t& }' A! w) a' K
) U; j4 V' a+ s以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 ( V/ w& E- | H
4 ~2 |, V3 g' ]0 k2 l3 D输出数据: & A$ u5 v! O7 C: O3 s: o
6 |. Y/ H2 }- Q8 n6 |" l
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 # T2 {4 N* l; y3 `7 A5 Q
0 n8 F# K1 ]" ]$ D输入和输出结果数据样例:
S. [0 {: Q4 G6 z7 C7 A/ K3 r. x( f
输入样例 % U5 N5 y- A' g: W
! x; K& L9 {3 f6 G0 |
3
% N, Q K: Z0 ^) a4 U/ g. ?
+ \% A- |1 X: j23
6 j3 H! V1 l* l3 N" c0 `! ?" ?6 d, |0 x! @9 \" G$ R& Y: _, C( K
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 % J( I7 {; I* S9 }% m5 C; F: B
/ X* e1 ]0 a% c' N' @3 e
25
2 R9 k" b; Y% `4 B/ ~7 D: O
! A! E' E3 n7 v9 3 8 5 4 8 3 9 8 4 X X X X 2 X X X X 2 8 4 9 2 4 . q% ?0 q) P6 P9 [( @- V
$ a4 A! f1 e+ C
43
7 P) }9 L U5 A* {
. H4 t$ Y1 H) F# c7 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
7 D0 @9 n7 }8 L1 e3 P3 | q ; x5 `2 ~- L% }: |
* s# T( s9 f/ }2 a
输出样例 ; h' N! v5 k) R# F L
$ J1 X3 v p# O6 j& } u21:17 ) V7 `) A" l( q0 `. i+ i
+ O6 y/ v( l8 C1 ]) B24:22
: ]: M( l9 L' D6 ]7 ^4 a4 A8 J$ c5 V# z
21:3 . x, C, x& K$ e( g/ a; ~# a/ ~7 H
! O+ p3 s0 Z2 W% k
Unknown 6 X ^( A+ r" d* E% x$ ^- J
3 _) ?* O0 I7 {7 e \+ n
21:14
P, I t$ A, C. h+ Y( |9 F! s
6 q# l# {5 d# \! p9 Z" y6 u/ X20:22
' F# q% r* v9 ^% }2 f2 B
& b7 r- V$ J0 P- L2 z' x1 g21:23 3 x1 n/ z" i* y8 }; {$ T& J/ t2 G! g
) A! E% R Q- |6 ~* S21:16
6 W( J$ F& a9 H: M) n
3 }6 d! S8 e% t8 P21:9 - b1 f% Y2 U) h* ?, ^
; \, _5 G b# p% D* w2 d& K) b2 y7 S/ }) ^, s3 C% C
example: public class GouGouShiJiFen {
/ I( ?5 Y' O: c- |* r
% e s8 F3 R/ ~( G+ g1 ^ public int[][] bs = new int[5][2];//当前可能的比赛结果+ e E4 N6 O8 P( U9 g
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果5 u' _7 Y7 I& `) w
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份/ Z# p+ M2 e0 L& u8 H- Q
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
1 \, V! W8 Y% | public int numOfAbleJu = 0; //本行比赛可能的结果有几种5 y! h. a+ }( I& N8 H
5 j8 `9 X$ J8 g4 h1 x& F* Q /**3 w9 f& _5 p1 t6 \4 V
* @param index 连续得失分的index
5 N" @9 y. G- |) X* Y% K * @param scene 第几局比赛
. W) x, I0 T3 F1 D/ W6 } * @param whichPlayer index处分为哪个选手得分
+ _. E* {3 r9 Q, S' f * @param record GuoGuo记的一行分
/ S7 [$ Y7 U3 m- B8 E * @return 是否是一种可能的比赛结果
% m1 E% [+ b# a& M; K */9 M1 I3 r* l- I u
public boolean check(int index, int scene, int whichPlayer, int[] record) {
o$ q- |: r8 x* |! V+ h9 p int playerIndex = whichPlayer; ]7 E% q; q: e& }+ X5 O7 N
boolean isWanZhengJu = false;' v1 e- X% `( y& M+ R% V
for (int i = index; i < record.length; i++) {. q0 J! C4 C2 F- Q+ M! L
isWanZhengJu = false;; q, |9 k4 B5 a- g7 g- ^
playerIndex = (whichPlayer + i - index) % 2;" }! K7 m5 g/ L" D3 M& J9 F
bs[scene][playerIndex] += record;
3 Q" g- V8 U# l6 B7 q9 V6 K3 E if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
# `$ }6 L* \# Z S9 H7 d9 P if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
( [2 O! C+ q- y scene++;
+ _2 P4 S6 j+ t Y whichPlayer = scene % 2;
: ?0 G9 e. ]& y4 `* t4 v index = i + 1;& q2 C- }/ Y4 {: P( Y. M b' \
isWanZhengJu = true;
7 Q% i: _7 Y3 Z' m. i6 Y8 P continue;
$ W, U1 ]8 Z# J8 Q$ u$ e } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的" B% l; U+ D* T: N
return false;
) h6 T: |( ]4 ~2 v1 W' ^" j }
) v# F; w6 i2 } } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
* Z! {* V& Z' z: r/ R( M return false;% x' o: }0 a6 k% a4 o
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
' g+ a! E9 a5 b! e6 l1 ~ scene++;9 f7 H; ?7 L& H# V V
whichPlayer = scene % 2;3 i4 f2 `0 L L/ v( i5 \! b8 \& k
index = i + 1;
2 e' R/ d/ v' @6 |4 F0 v$ D- i. l0 g isWanZhengJu = true;( X7 M; Z) `+ N
continue;" _+ X* w% p8 R/ q9 K. C9 o/ {
}7 x' t' u% h& E$ D8 f* P1 }
if (record == 10 && i != (record.length - 1)) { //下一个数分情况
, m# b) |4 C6 \5 P) q5 K# | int[][] bsBak = new int[5][2];
8 ^8 f. B- k: |8 ^/ _ cpy2deepArr(bs, bsBak);
, Q) z0 I0 l: _9 R if (check(i + 1, scene, playerIndex, record)) {/ h* D! a* m* ^
cpy2deepArr(bsBak, bs);& d6 m# W7 C- J5 h8 |
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误8 A, {. d8 d8 @; H( _4 w$ ?0 E, }
return false;
# G( c& a8 b9 m# L- a1 o }
) Y. z6 Q" ?$ x+ ` I return numOfAbleJu < 2;9 h2 P* p! K/ k
} else {/ u8 z r1 ]3 v5 U( A) ^
cpy2deepArr(bsBak, bs);
8 J5 y& i% @: z( M; Q% X) K) R if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {3 n5 z3 G1 J0 _+ K0 m. E2 N
return numOfAbleJu < 2;
/ I6 Q8 P: {( r% p0 x. F6 g9 S }
4 |7 _. u; F( e; d) A, h' H }
" k( o9 l+ |! x$ _; L0 a2 p return false;8 M1 X8 m/ O& Q+ x+ c( B+ x j" q
}8 C$ {+ ?+ B5 ]
} x% T5 N( g9 s; L# q: O( b# c$ e
$ }$ D# j7 V) R6 Z" W$ W
if (!isWanZhengJu) {6 R4 T+ r2 Y& ]- g; r( G% K+ i: z
return false;) X+ h$ T; l: h- `
}6 k: H! w E7 a: y1 ^$ O
// //检查是否符合五局三胜& n: y, U& ^1 @4 _/ t. A; q
// int a = 0, b = 0;8 r% G+ p0 a" V* f2 g
// for (int i = 0; i < bs.length; i++) {
6 {9 {8 n' _5 B6 v: Q. E// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
" f, N: Q' H! |- ^// break;
4 \+ ]0 n) f C/ G6 |& p# n// }
* W3 g* e3 Y+ F3 y; ]// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
* o: ~. M# Q* {4 e6 N" x// return false;9 l O' {" [% L5 N8 s
// }8 @/ @5 I4 g6 X/ S( x1 a
// if (bs[0] > bs[1]) {8 \8 |3 H5 a2 U) o0 I
// a++;2 h$ _, Z0 m, i$ \1 C% L
// } else {
1 J6 i- f$ w; j9 Y2 P# l7 x3 q5 {, L& v// b++;
U! |+ I2 }. y1 }6 C- ]// }& W3 }% T) G; o) W6 M0 |
// }
' Z2 M4 s5 Y$ K' W// if (a < 3 && b < 3) {//没有一个人得三局,故错误
% s8 [. k" m! ]// return false;
, b4 l/ ?0 ~. z. c% A5 X, Y// }
. a3 V B+ Y- |/ ? //只要有三局及以上正常结果,则可视为OK7 c1 G; @. t$ w* x+ M
int count = 0;2 Z6 B1 Z2 i* k
for (int i = 0; i < bs.length; i++) {$ l- ?/ W2 ^1 {
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
/ [; Z# v5 E1 M( H break;
; b5 ^( |- @: w7 C }7 ]$ h- \' T/ s' G* b
count++;/ {: R1 N) k h% _" t% r
}6 b' h/ N& m+ X l
if (count < 3) {
% q3 \9 Z/ o: _1 M. F return false;4 \, e! m" F# i6 ^
}: Y( Y; Z& l$ N7 W+ T" r5 H' s
+ s1 U) z$ A' i+ I; a
numOfAbleJu += 1;! J- y! y% t3 \7 Y' `0 L
return true;
" z2 R, d8 M6 J/ z. Z1 ?" \ }& _5 }1 _# n1 w3 i1 |+ @6 X, d1 H6 O4 d
private void cpy2deepArr(int[][] src, int[][] dest) {& b3 y9 F. z- J( r% i
for (int i = 0; i < src.length; i++) {
6 }3 l, J x" \( r# h' r for (int j = 0; j < src.length; j++) {
, Y) Q9 A4 o( W& m& W+ [& D* k$ {7 y dest[j] = src[j];; Z! O& s9 h# a- c( w5 ^8 a5 p
}
' n& K; ?2 i: `0 {; F/ K* I }" K+ x% S# i! H' `$ u+ i% G
}) g: v5 M H( |$ M/ i
* U' O4 O* Y! {. Y, N. f h% W+ z public void printNowCheck() {/ U3 N2 i+ N2 i1 F, U. z
for (int i = 0; i < bs.length; i++) {- P8 n" e5 _1 ?. z
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
6 A$ g1 U' i0 ^# j3 L6 C break;' e) c5 |" A! Z4 `
}$ I. w P6 X8 H" U8 } p
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出 l7 L" ?0 I2 G* Y- K8 f6 }; n' V% k% I9 I
if (bs[0] > bs[1]) {; J0 T' t3 n- W. X) y& K
System.out.println(bs[0] + ":" + bs[1]);; D9 Z% p: ^9 M4 L+ [
} else {5 r( V4 e+ C% Q n5 s
System.out.println(bs[1] + ":" + bs[0]);, e; w$ t$ ?3 a; A4 O0 ]
}
$ s( Z0 K7 p; x% ]& h2 }; S; x( R }
0 R8 J& H2 Y6 j4 | y }* B/ i5 F7 P! b6 s2 l% _" |6 G
public void resetCheck() {$ ]. b# F7 [* o o2 }
for (int i = 0; i < bs.length; i++) {
) T$ H4 U1 c4 d/ u4 K' {: Y bs[0] = 0;" w" n, Q, k( K9 q* p; V8 ~! ~
bs[1] = 0;
D1 t5 h$ F w) m4 b* z N ? }
! i. r% R- i1 t, P; f }
% e8 k$ p Z4 B* O1 R# j /**
/ p6 i3 K5 D- p( |$ a8 z3 n * @param args
* ]9 i3 @ ~- V; l6 X- j */
3 ]* X6 ^! p+ q7 ] public static void main(String[] args) {" K; ~) c6 q) p+ \- G; t3 d: w
// TODO Auto-generated method stub7 W- n8 g, t5 U* O* m
GouGouShiJiFen obj = new GouGouShiJiFen();: T3 X/ q7 M; {/ k3 ~' T' T/ ]
int[][] testData = {4 X" ]8 ]& m# E0 ]- f) W3 ?6 ~3 y
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},; I+ F5 I- L% I3 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},+ `; F6 ~8 X& `+ y% b
{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}
( F. {1 b) ^9 B' j* H. q, { };' d: n8 X0 p% x% X0 w7 [
for (int i = 0; i < testData.length; i++) {
9 l. x1 B) b; P$ M2 G& o if (obj.check(0, 0, 0, testData)) {1 t7 X- a! u$ q+ g/ `$ S
obj.printNowCheck();
$ S W3 ]( S2 D6 ~ } else {: y6 X9 J0 ^/ _, g
System.out.println("Unknown");( [; u w9 M% X2 e
}
1 @/ }7 U6 ]; U% j- I' [8 G obj.resetCheck();
4 u8 K3 @2 y* b8 `7 a2 ] }
$ J' f$ D- `7 C6 o( M1 [ }! `# X2 O3 X+ ]0 u3 D
/ U+ c0 ^! Z. ?* O$ d4 u; C
} |