题目名称:蝈蝈式的记分
0 X1 E- P/ Q, U9 U% R( ~6 s" d2 K4 c0 n) m
内容描述: + y5 K1 @" Y S7 Q; N. h
! z8 J E% w, {8 w/ K* ?
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
( B, T- l! w+ U8 i1 l( j
* ]2 }4 J8 @9 ]8 l: |& O( L因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 3 o; ]; R p* K; G' a
+ b1 N* `8 p7 V8 j1 K& Y( @需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 * d+ p: ~0 ]; t) j
- e4 g3 k \* T( {6 ]1 B
输入数据:
: R0 S8 z8 e* j% ]1 n6 k( I" e9 _) f+ _- X; V7 p( ]: s' t
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 - v5 |$ }- h0 p/ ~
& M) B$ B! K h/ x; Y' H7 D输出数据:
" B5 ^& ~/ ?$ k2 A. u7 k4 t
9 p2 f0 n2 I7 J# ?7 L相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 1 G8 ]2 G8 E7 z9 o3 X& Z/ P3 g" @
/ W, B0 `0 e7 A8 c
输入和输出结果数据样例: 5 Y5 f' P! d) E8 Y# a, ?, V
# Y/ u! I, z. B8 Y0 X& p3 F输入样例 6 [6 E R; }( M8 E6 |
0 D+ F. J" q% i- @' Q& Q
3
/ b2 o& P/ C5 D; Q4 h0 b3 { B. s7 c3 ]8 i! Y$ i1 }0 o
23
* E0 M \5 z) D( l, {& U7 I! l
" G5 c/ M l" F( c' v) o9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
& D9 h, x+ s9 d. V9 \1 l9 k, G- @7 e l$ K" p: Q' {: |( a" K n
25
4 T' d& a: i* U, L" g3 M( S1 Y0 B1 [6 y8 }7 `* A
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
% T; Z6 |" F( @) ?% f& P3 N D6 |' m. L, b2 J; Y
43 7 m6 ?! ^2 U* v
4 u( \0 k! l8 r; e1 O
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
: ]/ s1 ~5 G; c# }# M
! ]2 u' r# W1 O, c& o7 I; q4 N0 j
输出样例
; N7 p" D/ g; C) P; [& F$ G$ f' j3 b; p0 y
21:17 # i9 i8 V. w; q9 ?) U$ f
8 \8 Q- m; x+ J( j3 k" k$ C# F24:22
% |# s! f7 c" S
; Y N4 C$ G) `- K21:3 . o3 x M- i. ]% O+ }1 f
- k1 A. p2 V7 E/ v# y" h
Unknown
: N3 n3 L; J; a! A9 D/ I; H
! a- z- m) M- t* W+ ^" f/ F21:14 2 P6 q* w h$ C& a
8 V0 p$ f2 |% Y6 \
20:22
2 n, Y1 n, g) O5 a- ]+ W
' x! d. X7 o* S g) k21:23
% r% X5 [0 `6 \& {" ^5 e6 D# {, U
21:16
9 `# Q/ G% ~' |6 o5 F4 }: W( ]
8 R, ]9 V. J3 G8 \& R* U8 b21:9
' ]4 h5 E9 X- s9 k& b8 m0 A7 S* c
: E( {/ w- F) G2 T; P: x, A, }; D8 i k
example: public class GouGouShiJiFen {$ ]2 ^: H i9 u7 h i
( E2 G0 a% W4 F% M
public int[][] bs = new int[5][2];//当前可能的比赛结果/ ^$ t/ n0 P: Z7 s7 P
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
4 V8 C2 H& b9 S3 \. a+ ]+ l// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份 M; {7 T5 a/ I9 K6 i! Z: L' ]9 @+ n
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
2 C2 Z4 w# s5 [; L- v9 K public int numOfAbleJu = 0; //本行比赛可能的结果有几种; Q9 ]" u7 G* L( G, x
* b' C7 x) o. L% X' g1 Y /**' S" ^# G R$ q- B) w6 u7 Z |- k1 m
* @param index 连续得失分的index. Z5 n, Z2 Y, q" K O e. [- t
* @param scene 第几局比赛
7 q/ v. }3 T5 W v( G+ \9 J# ] * @param whichPlayer index处分为哪个选手得分( j3 f3 p: z& p) ^/ S) T- w- `3 j; ^
* @param record GuoGuo记的一行分
V* O, v! N. Z9 F * @return 是否是一种可能的比赛结果
1 \3 B- K, I* {' P/ b */
9 T8 X; i, D' `3 t( b public boolean check(int index, int scene, int whichPlayer, int[] record) {
' R. I, D" H8 c" Y9 D int playerIndex = whichPlayer;& R' b" T) E0 t% D) t5 C
boolean isWanZhengJu = false;
" N( u8 N4 j8 `6 D: F( J& N for (int i = index; i < record.length; i++) {' ]- j e: S4 i% o/ z- A$ \9 j4 ?
isWanZhengJu = false;* ^5 ~9 R& W. W! o- I. K
playerIndex = (whichPlayer + i - index) % 2;
% o0 S3 j2 p, z' b6 ^% v0 [ bs[scene][playerIndex] += record;
* a5 O0 f# E9 b! Q' t/ p2 q if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
) K& c, Q! T5 m, M0 N/ G if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
3 G: r+ i/ M) l E! r; n; F) f scene++;& ?! K/ g0 y! _; y
whichPlayer = scene % 2;
6 o6 y- T& W+ r3 X; K8 L6 j index = i + 1;
9 K' B$ a$ a! N, o/ O, X, R+ F isWanZhengJu = true;
9 O8 M' y, q# K% _% u3 s continue;+ A% d( {0 W1 g' R! p
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的# u; }: z# s) ? ^0 d+ G) V
return false;
% b% f- p. P b6 m( X9 d }/ c+ c" M# I& p0 _9 M
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的) l( P$ b3 r# ~0 E
return false;
# P5 }* H: O4 ]3 o. q5 ^8 \4 v0 ?/ U } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束- K3 f( p& y: [4 L( v& w' k* A
scene++;+ r1 b4 z3 Y4 Z# y4 z
whichPlayer = scene % 2;
6 \7 Z0 Y# V. v$ ^1 g# ]$ [ index = i + 1;
8 _* x6 ?. T( ~' Z% j isWanZhengJu = true;
( k, ^) P9 b( L4 R9 ]# j( L continue;! o% x$ h( g5 h. o% m
}4 K" C% c, j( `, C
if (record == 10 && i != (record.length - 1)) { //下一个数分情况$ w7 E9 c" B$ N7 N1 @" e
int[][] bsBak = new int[5][2];
6 ]" l* N7 Z, z1 Y cpy2deepArr(bs, bsBak);5 a N+ ]' M" [- o+ k i
if (check(i + 1, scene, playerIndex, record)) {6 \$ L) [8 f6 Q( Z! Q- \, C
cpy2deepArr(bsBak, bs);
1 `! _4 N/ A* k0 ] if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
0 m/ t Y2 S! c8 Y, p3 H& P4 O return false;
6 S( n8 v; G1 J: {5 a }3 r% b" G9 X& [" D
return numOfAbleJu < 2;
6 l, O1 J% M( y1 i. y% {1 m } else {
" ~: z% Z j/ X2 n6 S+ a cpy2deepArr(bsBak, bs);
" `8 T5 Q4 w: f8 u+ D if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
) y# |" I; N- z3 `. C return numOfAbleJu < 2; S. R: r% b! l
}
, C1 w/ V u7 y+ O' X/ { }
. Z2 w8 G! K; {/ {4 F return false;
1 K% ?; v9 ~" L# N7 }: v }. c' x H4 x4 W; x) @
}
5 O( D" b% e6 f5 w% e1 q& x9 R " `/ y) l! N; j2 ] m
if (!isWanZhengJu) {
/ l( C- ^6 H. b6 J5 n return false;
" P+ g! `) e( G }* t# j9 r' R S: y
// //检查是否符合五局三胜% G' ^. h# V4 F
// int a = 0, b = 0;
/ ?* f% T# F s3 X$ G. c// for (int i = 0; i < bs.length; i++) {
# }# ^& j% D/ I( E9 U* I// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
5 \5 a. M- [4 P7 E' R// break;; Q; f6 S' L' [" s# X
// }
4 k) `- I$ V& m. u# U// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
: z7 ^' W; s/ P. \// return false;
+ T8 K5 R" G' U5 U9 v: W// }$ Z X/ I2 C) ^0 H/ q
// if (bs[0] > bs[1]) {
9 Z/ L% P# w* D' J4 Z* F// a++;
4 ]3 Z0 \2 Q9 W; w Q- r// } else {
6 l; A- p7 u+ U0 F// b++;6 o d' o1 \/ V* Q0 t
// }5 Z R2 |5 N' g2 R) j
// }+ ]' B( a" n z! ~# t) y' a) h
// if (a < 3 && b < 3) {//没有一个人得三局,故错误
! D1 u9 ? y E; \// return false;. i+ C d& Q+ ^. N
// }
) b$ Q' o6 z, D! i/ i6 S //只要有三局及以上正常结果,则可视为OK
& [3 I1 ]7 m3 Q' f int count = 0;5 D1 \5 w: ?9 o- u/ P1 m6 V, _. |- V
for (int i = 0; i < bs.length; i++) {
$ z/ ?: Y& y M, Z$ r7 B% [. r if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
- y0 S. j! x, U8 |3 ^1 z break;; Z0 n; ~. r0 L! c; _
}8 x7 O0 Z8 H7 d- F" p: E
count++;( o2 g6 V0 {! q. ?$ G$ W; n) s
}! U+ l4 r. \1 f8 B( \9 i
if (count < 3) {
, a7 m, m$ V2 e2 m return false;0 O; R& w3 n9 L
}# T" I4 X6 b8 q; e& d% a
: E( M1 _& @% ~/ i! y/ c numOfAbleJu += 1;
. x4 T8 t0 ?7 L, X return true;$ P+ B. i$ t) |# f4 n5 }+ m
}* f& l2 n# u& r) K3 O$ z8 D
private void cpy2deepArr(int[][] src, int[][] dest) {
. B( n& m1 ~8 Y; T2 } for (int i = 0; i < src.length; i++) {! d! T- c9 |0 q$ f8 H4 f' `
for (int j = 0; j < src.length; j++) {
4 [0 R P* R4 Q8 p2 O: \+ ^ dest[j] = src[j];# F) d0 x, R# {* C J
}2 ]1 A( P& H+ j8 E) w( V* l
}
# ^; x* l+ }- F; d8 x }
/ {' K6 ^. L" { n5 S4 q
5 _) i9 {; y5 A2 P5 D! _5 \+ Q$ { public void printNowCheck() {3 k. w5 B; ~/ ]% x. e- l8 [! L
for (int i = 0; i < bs.length; i++) {
7 _' h: _" J) c/ D if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
" c- `& L P5 ], c3 i7 ` break;
- b! \0 z; o4 m) ?, `2 j7 k }
: q; X- Y W! Q9 \' p' P //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出+ R; W8 u- J4 V
if (bs[0] > bs[1]) {" h1 m4 x! p% j+ d
System.out.println(bs[0] + ":" + bs[1]);
/ l4 T% W1 X8 G8 C) s% J } else {+ z/ e$ C, j/ a/ s
System.out.println(bs[1] + ":" + bs[0]);
! o0 J' N# C# p Q }
1 C1 z7 Q$ m2 v: K8 C. b7 h/ L }
7 I3 k0 o; _! m/ n: i }
8 W2 N% ^5 e' h2 h, W public void resetCheck() {& R. @0 P* D6 Y% a3 l
for (int i = 0; i < bs.length; i++) {9 ?- d; v3 N* j$ [) B" z
bs[0] = 0;, r# R8 N( e+ R" T
bs[1] = 0;
' W) i+ J& `+ f8 W# A% a6 P }
1 G8 B% W0 u% S) x+ E }
# q* h& u# P6 x4 J+ x /**
5 _8 n, @4 ~5 J * @param args h2 r6 Y6 \" W( h
*/' B: b8 t. \4 c
public static void main(String[] args) {2 j/ C, L7 w# x3 E
// TODO Auto-generated method stub5 ?/ I! v0 |8 E6 V8 x6 G! ]: `
GouGouShiJiFen obj = new GouGouShiJiFen();. d6 j. c: y" i8 e6 ?9 @' y) P
int[][] testData = {
+ ]$ Z9 |* X$ c8 T9 X- h {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1}," r3 a! H. u, j2 G* X4 T7 H# h
{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},- S- K: o9 k o! y$ H+ \' F O8 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}
* f r5 A6 e; b& l% x };
5 v' Z0 P: q8 q, M) k6 a. x4 A for (int i = 0; i < testData.length; i++) {
1 y, }; R$ T1 c if (obj.check(0, 0, 0, testData)) {( ^, `0 ?) U3 e H5 h* ^
obj.printNowCheck();
( o6 M' j6 g: l% L, F( g, p } else {
8 V A! }9 O5 n/ ?5 C System.out.println("Unknown");
/ e3 H2 O9 b) f, S, W% |8 B& q) O }
^) C3 q; t& O1 @2 |$ B obj.resetCheck();
7 T+ G% \* K) i' G: W2 {( I }
' s# m- o+ n9 T& @) |, D5 ~( C }0 v% [: b$ a, G2 Q/ p6 e7 D% A
# j, R9 ~ q# I
} |