题目名称:蝈蝈式的记分 ' k% v" A6 n1 b2 I
$ N* T0 z* {' P! @* L4 f/ Q% y内容描述: 7 [4 ]4 o! x! s* {8 ~4 A6 _% y
! F5 a" V, }& n0 o( l蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 ) f9 j2 E8 Z/ e, C: D
! y: \: Z6 e- D! ?
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
$ @1 A0 F+ Q/ @8 R( S4 ~9 \% W7 d$ {3 l( I6 y/ W
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
' ^' B- D6 `, y; T) Q2 ^( C) V' }7 v: Y& k2 T
输入数据: 2 m) u- a% K8 Q- H
* ~& }' z1 k0 M: M& L, a
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
% O9 a8 I9 x6 v) l8 z I
. E7 u. b# Q; m4 ?, K- J" G输出数据:
3 L+ B6 }5 F2 x& v0 ~: K/ b( p5 T( [+ h2 N$ A6 ~
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
0 D8 P6 R% W4 Y" r5 \; N8 p5 A2 ]0 A' Q+ D5 g# `
输入和输出结果数据样例: 2 d( `/ r# h3 `% u. x& @% ~ @- o% j
+ {, E2 Z; W( T5 p
输入样例
D6 [9 g P: f8 j+ c1 S1 r6 z0 r$ y2 g1 M: ^9 y& e0 D6 l# y. k
3 9 H, b, T! v* h- i
3 C1 \2 W: \5 B23
/ L, z( q5 [' X
+ ]8 k- N9 C" X; n# V' D) y+ H( q5 \9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
' |' y( `2 s4 X; P7 C
1 F3 g9 @" s" ~8 T! m. Y4 }; _: `25 2 {/ b% ~% `5 A! P4 {9 g1 K
0 z( J' D4 N/ U
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
. o/ q* z- B; q) h5 L" O( N4 m' ^. a( Z( X
43
$ T- Z4 l, D4 _) w) v$ r% Z. K
3 ~+ x9 p8 G. [+ x( j* z7 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 * |& T+ g9 e( @5 w
1 O7 K0 i+ G0 N4 ^! y% M5 C% ]$ ^+ h: N+ d
输出样例 9 \7 A* ^& P! r2 T6 |" ~0 x% c; J
9 f& Y9 b) y# R4 Z' Q3 c
21:17 - n# A$ g% v/ r9 n8 t$ p0 y& {
! s2 W* ]; J3 `+ F7 ]4 C24:22
0 q' S. i6 j0 K5 @0 @6 [
3 [* s" }3 K) M5 y21:3 ) W# X) z4 o6 _1 q# y7 g. K7 K
2 N a! }( K( E. j0 P
Unknown
: x, F/ v. P# ~! h5 \, n" Z! S! C4 T, p
21:14 9 S# {5 n& I8 G5 Z
3 }$ ~( R: f) e% V P e& b20:22 . @7 C$ l- ]" K& A
; k# D; }6 L. \1 E2 ^
21:23
* a0 i( \1 y" b8 q% D* q& w' }4 J# ^0 p
21:16 . ?$ j$ P& |& Z: S
. f4 _0 ?5 G. L6 |21:9
1 v8 k* B2 y4 Z+ h 8 s, l: }; X3 Y7 x- O+ ]# ?
- E8 m8 X, ~) b; f2 T [( f4 M
example: public class GouGouShiJiFen {9 K8 w2 P; b4 P* B. e
- C+ {. o! h# i public int[][] bs = new int[5][2];//当前可能的比赛结果9 h( F8 N, }& Q3 o/ W8 t
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果8 j" x% O3 v- _5 z! l
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
& Q* t- ?9 o6 d3 b+ e// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown* p2 Y6 w3 R# u# D% _
public int numOfAbleJu = 0; //本行比赛可能的结果有几种 B) Q# [6 t# p* Z
! y5 S. m# _; w1 }1 K, ^4 A; | /**6 G- @3 i/ `, }. \% D" x
* @param index 连续得失分的index
! m# Q& U& b9 i' N * @param scene 第几局比赛5 t* x. V' f, o
* @param whichPlayer index处分为哪个选手得分
4 |2 j' f% z: G * @param record GuoGuo记的一行分
7 l, x! m2 r9 w) \3 M * @return 是否是一种可能的比赛结果2 r X- s8 X( \; a- a
*/3 x) I* w$ ]5 C: F
public boolean check(int index, int scene, int whichPlayer, int[] record) {5 Z8 g1 i ?8 L" E7 [+ g8 S% ]; Q
int playerIndex = whichPlayer;8 j% n" A$ W+ B$ t9 a1 D
boolean isWanZhengJu = false;3 @. P, @/ Y" y1 R
for (int i = index; i < record.length; i++) {, n% @+ L; J/ O4 P5 ]
isWanZhengJu = false;* I! v) v* S+ \ K, T
playerIndex = (whichPlayer + i - index) % 2;+ o( o2 i- t. T5 }
bs[scene][playerIndex] += record;
, ?8 i1 L$ D' K$ v, L) _( H; \4 U if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
. a( X4 l. |/ r if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束+ B2 u% X6 |) l( c
scene++;( [9 k/ L2 s1 s0 F! N
whichPlayer = scene % 2;
* v' c" k! ~5 t* | index = i + 1;
' }9 }+ B/ [) w. J" D: a4 ^ isWanZhengJu = true;2 K o: K; Q! f; ]) J
continue;7 t: f9 F3 c: z J8 _$ y4 C+ t
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的: v, o! \0 ~$ h, @1 l( E1 K3 _
return false;
7 x9 E8 G; Q" I, Z2 m }, F$ [4 P0 P0 q5 X- n
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
' b, y+ ?/ B2 ] return false;
) E: _( H) |& O% m6 ` } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束1 S6 V( `/ v+ s2 b+ T
scene++;
7 l- U7 t' `* b# m9 j whichPlayer = scene % 2;
3 p5 s% p7 ? j index = i + 1;
l+ c& M9 o5 |: J& ]2 } u isWanZhengJu = true;
) S0 c ]" @2 C* V; a continue;
1 P% e" [3 b0 ?- ?$ C }
/ k6 @ H/ G+ n. R$ j6 K) W9 B if (record == 10 && i != (record.length - 1)) { //下一个数分情况
; P4 z+ a! v( U1 C/ |+ _ int[][] bsBak = new int[5][2];% C B% P% G! ^3 G/ W$ ?. S: A9 m
cpy2deepArr(bs, bsBak);
- | m. x* L. x |$ t if (check(i + 1, scene, playerIndex, record)) {4 W Z7 r* ]4 U1 Y; \
cpy2deepArr(bsBak, bs);. p, Y3 m* e& U! ~2 S4 y R. Y- S
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
! S* m) K2 |1 o7 S) G q0 P return false;
- T \! M, h/ w9 h. S }
% v- _# x" c3 n) ? return numOfAbleJu < 2;
, c2 z' a- K2 l2 @, @- L8 P } else {/ }3 c, W) W3 Z* q
cpy2deepArr(bsBak, bs);
- r4 f3 z% _/ _0 J- x+ H if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
9 `7 f7 l' v. y0 E" L5 ^+ }$ c return numOfAbleJu < 2;8 K! M" m6 z4 N) D% t
}" |9 p7 R; y! Z' P; b% n; r
}3 {4 q9 t7 I$ M# ~/ e8 t9 a
return false;
( N: K8 u7 N: o! b }
! k9 K/ \- o- C" b- z. C' r$ _ }
. c/ j9 b3 t5 P E% @, c0 T4 L! Q
S% [, O5 h4 J$ O$ t! U5 A if (!isWanZhengJu) {
, R4 S! K) d; _( L return false;
; C2 h: b; F4 _5 ]5 K }
' a! [$ d( Q' T6 _- P- C# P/ [// //检查是否符合五局三胜* T Q5 R; S5 Q9 m' @! d' q
// int a = 0, b = 0;0 ?; o- |: M2 f. ?
// for (int i = 0; i < bs.length; i++) {
, c) B/ E, z, o' X1 S// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了9 S: K d$ O+ x9 N+ U
// break;6 r+ p" y" A- t, W& N, [
// }. R5 c, Y/ c9 V0 o2 z
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
* ]2 Z# v& l; o' q4 q [0 X// return false;! \1 N! M; a$ W! }# K( S* Y
// }3 r' P( J2 j" K' i$ l
// if (bs[0] > bs[1]) {
0 Z1 f a% o3 _// a++;
/ I5 h' @7 u/ e. n( _0 x6 u// } else {; f8 y) ^" v; \0 x3 z' N- }
// b++;
/ ?! D, X, a/ B. w/ _// }
0 C1 n/ @: r, M: s: J// }
$ t8 C: J' G" _' b// if (a < 3 && b < 3) {//没有一个人得三局,故错误5 a- b) C! m6 m% k& q- Y
// return false;
8 _! T6 {, p( o4 e' @, U// }
6 j0 ~4 T+ B5 M4 A //只要有三局及以上正常结果,则可视为OK
# B+ Q( F8 q- _# z5 L int count = 0;: Z8 T/ A# m& N0 W3 {% E( d
for (int i = 0; i < bs.length; i++) {
7 r2 P1 k4 _- ^6 _# V" {! u' k if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
2 u) s3 |; T! Y1 k9 ?! H- A break;5 ?( }, P- J2 L! C
}
3 e, R' s! Z/ z" c count++;
. ?+ G) s4 n2 V! ? }. N0 W6 l4 l4 y; P7 ^( A
if (count < 3) {( r6 I X5 v4 F- l
return false;# d( Y& {7 S6 ~8 s+ H: m- M
}2 k7 x$ y. u3 m; H; m9 c
6 v8 I: k- N; o( W8 _
numOfAbleJu += 1;5 d' W2 ~& Y6 K2 v6 J% B; z, l
return true;, L/ [" b! T% x' H, O
}
; e* c9 B. q% W( u0 {8 y W private void cpy2deepArr(int[][] src, int[][] dest) {
& L8 R6 V5 }# X6 z for (int i = 0; i < src.length; i++) {
- q) z8 R7 L# P9 q" b7 Y! I- X7 [& f for (int j = 0; j < src.length; j++) {
/ m H; W0 G: {' y dest[j] = src[j];
, ?" t% Z! a8 `! g0 R% r/ n }
, ~9 K0 e+ h% Q }
, j% b7 w5 l5 I3 r }0 n2 E# \% N+ S" a# I
% h+ `& L8 b; g! ~ public void printNowCheck() {
6 v) R: ?+ \/ @8 n for (int i = 0; i < bs.length; i++) {
. k, a# f' J( K ?: S* X if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了2 e+ I; i: Q! E; S$ j
break;
) w+ F5 j6 X% j$ E }) @/ X* \1 n4 m" p' g
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出5 x" p- Y# Y' \, [1 d
if (bs[0] > bs[1]) {
2 l4 {, r f+ z+ m% p System.out.println(bs[0] + ":" + bs[1]);8 g8 u1 L* O3 X5 U0 }* b; p" ~$ M* h
} else {
1 `, O( F1 X) X( l9 f/ q System.out.println(bs[1] + ":" + bs[0]);
4 l" k$ w5 m: D }
5 r5 T% R. l# ]% U# X }
; Y5 F! I7 n; B. h+ ]7 ~: a. A! m }6 M) y: s. c. I0 c8 W/ d
public void resetCheck() {5 S7 R" _/ B8 s5 u1 K
for (int i = 0; i < bs.length; i++) {
9 |4 U3 T7 I- \. }7 W& v' _4 Y bs[0] = 0;
( e3 k3 Z4 k0 a5 u& |0 X0 x( l. u2 e bs[1] = 0;% Z E) z0 ?( u* O' i! t
}
) B9 m2 a: F, J4 m0 b, J( _& a }
; r6 \: F2 T6 |8 A! l- [0 k /**0 N, y6 v* ? X' F1 i# E
* @param args8 O0 P' Z; h; b6 V
*/
+ `# x8 H, G0 C$ g& q0 k9 g0 L public static void main(String[] args) {
% u n1 C5 V" W# m% p // TODO Auto-generated method stub. F# v; I$ @2 J. q
GouGouShiJiFen obj = new GouGouShiJiFen();
2 p) |: K$ X2 n7 i int[][] testData = {
7 C5 f* T G& _ {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},3 w4 d/ ^* j$ J. t4 z6 {* c i- N( W
{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},; C4 k; Z/ w* {. 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}
+ k1 I9 K, \6 U- G: } };
7 H5 R6 s, S8 v# ^ for (int i = 0; i < testData.length; i++) {
1 z9 G- ~ u; T+ s% P, o6 g1 s; p5 } if (obj.check(0, 0, 0, testData)) {1 g5 p! J; v. B8 d9 S! I
obj.printNowCheck();
8 y: G. R( v3 [ } else {
3 Y$ C. z @8 q- H System.out.println("Unknown");. q# x+ P8 J" L- _
}
% l3 i ?; [+ h; a# p obj.resetCheck();
: y ?! E( a0 y; y* e }. p2 W* I' F) W: F1 f9 E5 ~
}
7 v8 o, J P2 y3 f; H# w5 U
& c+ O; A2 T- ]( K# @* a; j} |