题目名称:蝈蝈式的记分 8 h* c" S9 }! N' D5 I, j- p
$ g0 z8 q$ C& R3 ^
内容描述: / i8 P8 h3 d7 I/ D, S2 z8 b+ T
. ?) w8 ~' p9 g! _; H蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
) K; E/ u/ B) }# Y% S- [/ X6 ?4 [2 D. {0 s" d9 f5 w s3 C# U
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 $ H% F) M+ D, l* ?1 P; ]( G
0 b& F6 ~' K% D+ \3 H0 }! A( {, T需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 2 k+ t% H, {: I7 F
4 F% k6 b( ^* L. Q3 ]
输入数据: ' @7 X# o& m# v8 p* [7 q
6 O! S. q1 Q. j2 |- o9 H1 k7 |
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 + D4 ]" \6 ? C8 F; d
) K8 C8 W& e Y' m输出数据:
! P* E$ O3 r* Y& S
: I. Y/ m! y% M* m相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 " w. s. V! @! k# z
W( e: r6 k+ C+ Z1 e: _输入和输出结果数据样例: / t* A# @) m. _$ i# _; X) X
9 \( d5 t) K# o4 X$ o, @
输入样例 O. U, V0 \9 T" i" t: i/ X
% ?' ], q" i: U9 |/ r2 I3
/ l6 Q. `4 b, D0 v4 O% m
/ z8 ]6 k' t( S8 w23
9 ^( i" I2 W" w) {/ L) h0 J2 I, R) a) Q4 I5 g
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 ! @* L: M" O# Z' S1 ]
+ G( @" i% q# j: v1 `& n8 e' v0 P
25 0 V- F! ] r) \' |
7 a# p/ Y7 o H5 [" U" u9 3 8 5 4 8 3 9 8 4 X X X X 2 X X X X 2 8 4 9 2 4
8 U+ `5 \5 O: ~, E, {# ?- p9 A: T% i- e& O1 Y
43 8 v K5 ?6 e6 O3 S* P' a# M8 q
) ^8 k H8 V/ J' 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
6 m# z6 A3 h, l2 W/ U+ p) r
3 S" E( R0 X, f1 J M
" D9 ?# m9 H5 e$ m% ?0 h& ^/ H输出样例
0 `- P( _: t7 | r5 G5 C& M; G6 h2 v( {! o7 D5 B7 q
21:17
, Q! x5 a5 s/ F
5 E; C) z# x/ x/ D2 x* `24:22 2 I+ |7 H' k7 N+ n5 C3 m( u) y. _
, m+ m& H6 [3 [# n21:3 5 y0 w0 I, \. g9 M
: t& z) ^ R4 D
Unknown ) G. i7 q# m4 E
/ g9 [1 _ S" U5 y
21:14 - u) H2 x; o7 w% @! `0 W
! P: S; {6 ]% B1 Y
20:22 ( G; |( j6 ~: J
3 l4 S: B8 S4 ]. A
21:23 3 j# E' j- x U8 B z4 j( U+ k2 U/ T: t
+ h( F! z9 X) c; e* _; d21:16
# Y9 m: w4 N* @! p
0 ^' V$ l( t/ Z21:9
- j( |0 `4 E& \- t5 N
b& z5 F/ Y+ {6 l: v
b! f R& o5 \% Z! J4 _! `example: public class GouGouShiJiFen {- X+ L- S1 X+ u' ]7 S
! H: c# `. f) s. T/ i" D5 @
public int[][] bs = new int[5][2];//当前可能的比赛结果
8 \; C: L! Q/ G1 v0 M r2 }// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果! s( Y, E$ X0 P
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份# {1 D) @7 v: {& W$ j- z6 m
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown. Z$ R5 G# x, Q- k
public int numOfAbleJu = 0; //本行比赛可能的结果有几种3 F# |1 x& X$ j9 E" M
2 [- U: F( {* ^: | /**
0 O3 c2 m+ y7 {9 X: _ * @param index 连续得失分的index& r+ r( m4 S+ D% k3 {5 j, Z( E" X9 T
* @param scene 第几局比赛8 }1 }( D( g; [ o1 W: z9 X1 h
* @param whichPlayer index处分为哪个选手得分
7 F* y0 a7 \0 W1 ] * @param record GuoGuo记的一行分
' h* Z- O# k/ g# e% k8 j! F * @return 是否是一种可能的比赛结果
+ e [ ?2 \2 f) I */+ l. t$ p t: i3 p
public boolean check(int index, int scene, int whichPlayer, int[] record) {
/ \1 y4 H$ m* r# x) k: _ int playerIndex = whichPlayer;* b& K& f6 A/ @7 y6 I! J
boolean isWanZhengJu = false;
9 l1 o$ m( [& N; X- j' [5 j5 G6 b- ?% E for (int i = index; i < record.length; i++) {
; z$ M$ G0 P8 j3 a& N isWanZhengJu = false;
3 g3 r$ B7 o/ \% r playerIndex = (whichPlayer + i - index) % 2;
+ x5 L! ^2 K( g bs[scene][playerIndex] += record;
( o5 {) V; @ \ if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
3 d% f; S+ M* X" e5 e$ | if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束9 s- `7 r3 } U1 ~
scene++;, s0 D+ ~5 }" C7 I
whichPlayer = scene % 2;) N% `, z" F2 ]' `
index = i + 1;
6 S1 J' f, t; q" {; V) X1 D: g isWanZhengJu = true;
4 L: u* g8 g( {% e' E continue;6 J7 \* Q4 r7 i* b, Y
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的/ l: `0 t+ {5 T1 O" i1 M1 U6 q
return false;% C' u8 k" F- r8 L. C0 k7 s* a( @
}
/ f1 z1 T: i3 I- D } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的/ n3 G+ h$ B7 E
return false;$ F U! g4 T* R) P/ G! [
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
8 Q8 ^: m) f* E. @" D0 q scene++;. j3 Z8 s- w3 Z7 _
whichPlayer = scene % 2;! }7 s8 n; _! X- f
index = i + 1;# p1 C( ^8 p* y! E8 G% f
isWanZhengJu = true;
9 F+ R% s! ]7 J# W continue; O* R0 ]% S5 b2 S5 B
}
! S" I/ L1 v% e- |2 b, J if (record == 10 && i != (record.length - 1)) { //下一个数分情况
5 `6 ~+ E+ g+ W int[][] bsBak = new int[5][2];
7 q" O# X) a ^% @& |' G cpy2deepArr(bs, bsBak);
: b5 l+ E4 a% Q# u: ] if (check(i + 1, scene, playerIndex, record)) {+ S5 _2 m4 S5 N& ~7 Q) L
cpy2deepArr(bsBak, bs);6 c9 N# R9 J: E) u6 s( Z7 Q b5 o
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误4 ^4 m% i# t" ?, o5 C0 k$ \9 |
return false;
8 u* e# ]4 x1 T) M) z8 }$ ` }- S" c% H& U* y6 k
return numOfAbleJu < 2;
& v* D, s, _4 {! J* F# r O } else {
* S+ R. E8 G/ s* k t- B& C- l cpy2deepArr(bsBak, bs);
; S$ w _0 E, F1 y( o7 a" n! A4 x6 C! Z if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
8 v& I6 l; t& \; ?8 B return numOfAbleJu < 2;
7 G, J# T/ i) V8 }; F4 [) r }
% ^0 D" i2 Q- p1 E6 q }$ e, q( m+ ^& b# Z8 [" |
return false;
8 ~' ^! j. i- ~6 l6 o3 P }3 A+ q( p$ Z% M7 Q' y5 @
}& p! W8 J3 m. v/ b/ x {# ?9 p0 G
6 Y3 A! ~' f4 o, h$ C/ \: E
if (!isWanZhengJu) {9 W; o8 q* `( U7 l
return false;
1 g. ~: U! t3 d) j# o4 h }3 ?: ~! v6 o( @6 h c
// //检查是否符合五局三胜) k. w8 N7 N7 C' H9 O
// int a = 0, b = 0;" F' M+ E; W, U! {
// for (int i = 0; i < bs.length; i++) {
9 n" H; q G7 V F+ f) U# A// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了* V w; R# l2 ] `, B/ Z: f
// break;! R* g# M) g+ M8 A; L' P/ M
// }
" [2 B% d6 j3 w. V/ Q* P; w2 K// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
% T9 j( N% S6 M& n5 H( Y2 J; O+ z// return false;
7 M( p8 n2 V" J# ~8 r3 a$ L// }/ I' c3 f9 ^# T
// if (bs[0] > bs[1]) {
; `0 c5 ]; ^+ ^9 C" Y2 }// a++;
* `, t# y+ l; `( ]// } else {! D1 i* q( e! `* e! c# g3 Z+ v
// b++;
3 T0 [6 H0 ~: q- h4 f( J, R0 `& w; K// }* `! L+ n( {" n# P! n+ f
// }
! E( L/ }4 @/ }/ F// if (a < 3 && b < 3) {//没有一个人得三局,故错误
; f( W9 \, R7 R) g// return false;
6 H5 x# D, c# z) h. h. m// }
! S# h& R w% N) }5 V //只要有三局及以上正常结果,则可视为OK4 x" j/ e- ~2 _. p: r
int count = 0;6 Y6 A4 F8 |/ `( Y0 q
for (int i = 0; i < bs.length; i++) {+ x+ y. l: L2 a: o7 t
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了) U2 Y! z5 P: R- g
break;& k- e" L5 \# |& e! e C: d- G
}
) W( ?" s3 H, _7 G2 {9 d l. ] count++;1 t0 u% B6 z9 H+ ~+ R& q/ {
}
2 j, r2 {3 p# r- I4 n if (count < 3) {
" V3 k& j$ q' ~, { return false;
2 h! {- D. a p5 f0 u8 z }
! T5 E) Y! p! C+ j4 q% W
. {2 R% ?- q& U5 i$ t numOfAbleJu += 1;
5 F2 D' v3 G* b0 I Y& } return true;
- }( m/ \4 c4 r5 u c/ g }, b/ b6 n% j5 v" f
private void cpy2deepArr(int[][] src, int[][] dest) {
0 i( A$ s, o# ]% q/ j& ^! Q3 }; G for (int i = 0; i < src.length; i++) {- F' A$ d. z2 m r
for (int j = 0; j < src.length; j++) {
4 ^8 d# z5 I/ X; @2 V2 @5 V7 G dest[j] = src[j];' z' J4 @6 _) c/ c9 M
}
5 m! a* T5 p# f5 F! K }
7 C) v: f! M9 Y' L4 B5 w2 m0 c }
) d- f, U5 C- _5 _ @+ o6 X" a. W
- A7 r3 B( g! s5 Y' e4 K0 F public void printNowCheck() {
8 b, @7 K4 y! a" r' y& N3 u for (int i = 0; i < bs.length; i++) {- F% t$ n3 l! ?* O/ I! z
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
; B6 } h- x2 E- b. k a4 c9 f break;' M" g, ?7 n$ ?
}
' j- r/ {, e+ U7 k //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出/ z/ z, `& N. o, R. Z/ W
if (bs[0] > bs[1]) {5 c3 ^* L8 E4 l8 K: L4 R; V$ v
System.out.println(bs[0] + ":" + bs[1]);" z8 S1 O7 p) t( c
} else {
y- I0 N# s% w& t+ q# S System.out.println(bs[1] + ":" + bs[0]);
- Z' R) F; o8 W6 J/ r! A* ~ }
" }/ g U& I$ b) n' V! x# B }
/ _2 u3 ]( P( A5 b$ `( m }% \/ u7 u2 E+ }* S. P- B; j
public void resetCheck() {0 ^5 [, ?8 Z9 n+ o
for (int i = 0; i < bs.length; i++) {
+ H \3 s# X2 Y- }) t" ]2 _ bs[0] = 0;' @0 a+ Z6 Z" x- r- V4 x. ?- R6 |
bs[1] = 0;
* t7 j9 M+ A1 B/ Z* c1 _/ N" Q$ Q* \ }) W, E& Z2 I5 j; g. d! G
}
+ t5 e& V( F! M1 Y4 n2 x- h /**
+ s% w% @& c3 j0 Z: Y" N * @param args4 n/ r- u- n9 R3 W$ j6 I4 s% V2 c
*/
* U: e" w+ Y, _ h public static void main(String[] args) {
, v/ T2 P; t) ?8 W9 |/ Z A // TODO Auto-generated method stub) D, e% ~; {9 K8 |% Q5 v$ s
GouGouShiJiFen obj = new GouGouShiJiFen();5 \, m( ^3 k+ ~1 J. R0 ^7 o
int[][] testData = {2 g( p/ H9 u2 n- T% Z p9 B
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
+ o: s( x4 k/ j7 X+ Q {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},3 ?1 i. q/ ^& v, {! F6 T5 L
{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 o9 n1 K8 {- T- |! _2 Q8 N
};
) {- \# h1 R: |/ y4 g4 \5 ^+ h; F for (int i = 0; i < testData.length; i++) {9 ?- U' n$ H% `2 y( z1 l
if (obj.check(0, 0, 0, testData)) {& b" o, W! i( ~- P
obj.printNowCheck();1 x2 _& o# t5 m _8 D- S0 k
} else {- M) B/ l& u" o; v, e
System.out.println("Unknown");! v1 m) M" w1 J5 t9 H6 V, r
}! c' r1 L+ N+ x B; B, t
obj.resetCheck();
% ?3 _1 ]3 b' |+ r C) a3 M2 c }
$ V: L" q' Q( ^; s+ h }
4 z; T A5 M+ F. E$ L5 |
" d" _& x; b# B) Q, T} |