题目名称:蝈蝈式的记分 & f( A6 w# G+ h. }
) |" o" e; \5 j- c内容描述:
% |1 r; c1 K* L$ v
' j: m3 Q" Q# t' }* O% u蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
* X6 r5 u X( [& I% D3 [3 s, T/ U2 t% N6 C ?. W
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
; o) [) s+ H3 J/ q- Y$ G1 A$ z) D) `3 q. t X
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
. S& n7 _0 G. x+ L8 ?
* S$ }5 t2 D. q) C) q) P' B输入数据:
, {" \& P0 }( C8 |0 o$ e' w% W+ X+ }) R3 D1 w% L* t$ o
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 . K5 | x+ F% {* l$ s
3 `- M$ C( u% a, `% z, a
输出数据: 3 v1 F& @* ]$ N& Z* k9 W4 @% y! J" {
+ i6 [, j! _3 T U+ w) x$ r* M( H相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
' d# e1 |# a; A
0 x4 u+ g- C. z输入和输出结果数据样例:
# `; Z/ W' t: M" @" C9 F; R1 s5 K! S4 t4 M! Q6 |, ~% e3 }9 z
输入样例
: i* f7 [" [9 t* E: ~
2 t1 m C' j5 X* k7 J& `1 v3 & M$ Q) Q4 N' Z2 m
$ b# a+ {$ D2 b/ k. [/ q$ N1 Q23
3 \4 k$ D% e0 K9 U6 d) N( w
* R1 C; f5 n) H5 Q9 K0 s% p9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
; t) q- [9 [1 Q7 h( r
( [$ S4 P( V" F' X1 [; k25 - W! K9 _8 s! a, B l
! O7 V/ N# S5 L+ f# ]
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
, a1 r& F; K5 ]: I7 T* I
$ ~: K! v/ y0 I* U! f43 9 z5 k4 h% N* @7 z! X: ] n* H
# f0 K( q5 |5 u! ^, G' 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 2 E* n0 P# p$ }1 O
2 r6 E' d* e9 K& Q0 H* |- D
2 z% H, J4 G+ w1 n
输出样例 ; m& Q& {2 R8 B5 Y" A3 J9 [
. k' M# d& k4 m2 k3 {21:17
3 R7 `5 f) t/ f$ a; H1 P, E: {
% j C4 J( {$ ?/ g6 {1 ~- D24:22
0 Z% N0 k/ \2 n* f5 B" t3 g' |
& O' c9 l3 B- `% V8 e( d21:3
8 u' l; T* |4 z/ H. A5 e' m+ r. F# L; f$ C# V2 E5 M: J
Unknown 1 ]9 J* j6 Y, s' B: Q- {# t- B
+ K4 T, Z% ^# |1 d) o2 p
21:14 + J" j: y. y6 T
1 X2 o# H2 H& j+ L4 R! D
20:22
~' q G( r/ U& L, Q4 l4 f B4 |1 {- q" |$ }2 f" w3 \2 g3 ]6 Q
21:23
+ p8 C, r/ K9 \
b) C) M' g$ B$ V1 d21:16
8 m" ]& F1 i# B! J9 T6 G: B/ ~8 N1 l
21:9 % }" l/ M. t* w. U
+ k3 n& h" Y1 P, D) a- |" E' N5 d
: D$ ^8 b$ @5 N- R3 p
example: public class GouGouShiJiFen {
7 E5 W+ ]3 {1 f& W* u% m4 @
4 Z; R6 }# O! o7 Y7 o Q: @5 \# r public int[][] bs = new int[5][2];//当前可能的比赛结果
R. e3 ^1 E& B9 E0 m% t. l7 ]// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
4 t5 L- R2 t7 y- I// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
4 k/ Y9 W( ~* T9 }1 A// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown* ~0 T1 b9 q- B8 C
public int numOfAbleJu = 0; //本行比赛可能的结果有几种
6 Y& ]& `- R7 \9 S 3 T1 t: u9 W7 E2 \5 g: P$ b/ P( U
/**/ K! q c9 V6 I2 ~
* @param index 连续得失分的index
5 X; I- G. v- ?( H. U& O/ N, z$ T * @param scene 第几局比赛3 @' P7 H$ A" w. l
* @param whichPlayer index处分为哪个选手得分
4 K) O8 l) b1 y' n) R, E2 G* e, H * @param record GuoGuo记的一行分+ l% s. `+ e- V
* @return 是否是一种可能的比赛结果; p) b3 f/ \" l) S* A; [7 @2 L
*/% }3 u, \5 ~7 g. W
public boolean check(int index, int scene, int whichPlayer, int[] record) {
' }% R- L h( K/ |. U int playerIndex = whichPlayer;7 P+ e% f4 o5 `) A
boolean isWanZhengJu = false;1 k7 E5 ?2 O4 V3 {
for (int i = index; i < record.length; i++) {
: [1 c7 w+ ^9 h+ n8 n+ B isWanZhengJu = false;
6 U" U- P+ m/ g* f7 I3 q5 i: O playerIndex = (whichPlayer + i - index) % 2;( e3 ]4 O7 b5 x9 k1 I( g2 J" L0 u
bs[scene][playerIndex] += record;
9 T: v' [+ `; _- [0 q& I5 h if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局* Z0 g- F/ Q% Z3 u( O, c f
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
7 }' D, D" u+ r B3 ?* [7 v: n scene++;5 b% _2 T5 p; A1 `
whichPlayer = scene % 2;
3 Z1 v! Z( K; J) ? d1 a index = i + 1;1 M/ w2 p% z9 _4 x/ z' i
isWanZhengJu = true;6 Z# ]; J3 ], G8 G( u, J G
continue;
" P/ n2 ^& X9 Q' L: F: ^$ ~ } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的- C5 r( I) s: a. B: {! `; m9 V+ ^
return false;- c) _" g+ B! J( } v+ t$ H( g+ k
}* E& R7 l6 R" ]) [ H
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
, G$ n! X: @# S" h2 V8 e6 B return false;
9 s1 S6 r' @& b, m( p* v/ j } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
( c3 ~( }& u3 Z7 B2 z1 w) ~1 ] scene++;; F4 W w: a% p' I1 _4 B7 `
whichPlayer = scene % 2;
3 r1 |3 S, U1 n1 M index = i + 1;
3 A M1 E7 \* E isWanZhengJu = true;
. C, T, j4 n" ?1 y# T1 L continue;
( x' d- t9 E5 y" Q3 @! Q# j; O; `" d }& k/ {% b+ m* v) X$ {. Q3 \
if (record == 10 && i != (record.length - 1)) { //下一个数分情况) b! g" v- J6 T/ p" M
int[][] bsBak = new int[5][2];& M* ^. B( {4 B: F8 ]' b
cpy2deepArr(bs, bsBak);
2 g* r+ S/ H. M2 t if (check(i + 1, scene, playerIndex, record)) {
; L3 L1 l: H7 Y. g1 v; o4 _ cpy2deepArr(bsBak, bs);
1 a, a" q/ @9 F+ |. ? if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
- K! J1 U1 [& {0 N return false;
: { x. L5 w! w4 s0 l. q }
?' o" l% Q+ p6 Z( ^5 V" [ return numOfAbleJu < 2;
: d' R* Q1 c" d) ~7 `& r6 o+ i5 j5 t } else {' e$ X3 T% R" l2 U& J E
cpy2deepArr(bsBak, bs);
& ?6 {% }; L H/ R if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
1 M3 A( C, H f. g: W return numOfAbleJu < 2;
. J% A* T: c/ B' l }% x1 [5 J1 Z! ]; W s- S/ ? C
}
4 [1 U, E) V: ]' b9 ~7 H return false;8 W4 H3 F! W: X9 K9 e* I0 d
}5 x' ~4 P! J+ e6 B* t& ^& c
}' w1 U# F6 D1 p' [2 N, C+ y7 j
6 W1 O O* Q0 j4 O- a5 d' ]: f if (!isWanZhengJu) {; R' V% G; p( h5 t, y M
return false;
- k# O2 i z) e# m; V" S }
1 M1 x7 W7 H) w// //检查是否符合五局三胜
) H" N/ u% Y7 s0 a8 l// int a = 0, b = 0;/ a3 U: }6 |$ Y2 p0 r1 J$ ^- C9 L3 @
// for (int i = 0; i < bs.length; i++) {( R. U7 e7 Y; V% k! k
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了4 z5 i$ g6 _& e" h1 U/ {/ K
// break;
) Q, {, s5 I; F* I, i4 \8 H// }
3 Y' U" E" M: u& v: j. V/ E% f: Y// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制' L. U% {9 ~5 ?5 K
// return false;6 G" l4 @+ s3 h; N7 l6 p8 N& v D( ~
// }
$ u) V( \) \- K, ?7 [// if (bs[0] > bs[1]) {' M/ d: _9 _9 _- R
// a++;
* m* ~* R9 v# n* m& H( `// } else {$ q4 q% Y: I, E6 r3 S% A' }7 U: G6 _
// b++;7 b; Z7 O% X. \
// }
1 Z$ U, w2 L8 u \+ X// }
& P3 _0 ~* U4 Z$ h. Y& A% g" O3 e// if (a < 3 && b < 3) {//没有一个人得三局,故错误6 o+ o2 S& g$ @' O! e U' F# t
// return false;6 y3 {; N, P9 \# F- W3 p& C
// }
4 ^7 A" T# t/ ?3 k" O //只要有三局及以上正常结果,则可视为OK/ |+ m& Z$ ^1 {# k! ? E
int count = 0;4 }1 ~4 G3 {& L4 z
for (int i = 0; i < bs.length; i++) {/ p; [" C% G8 d X8 z0 H
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
& h6 M+ W+ M0 _6 ~0 u break;; l( }2 o# b$ @* n
}( g, L) j8 t/ Q, B! k7 o
count++;: M8 L9 a' N l& q. C
}. h/ S' C4 I4 ]4 u8 q. q0 l
if (count < 3) {
2 h4 K- q+ |! h5 d4 D; Z9 P return false;
4 p3 w+ [3 u; D+ m( [/ p }* a4 Z( z+ J$ k" D
3 p8 Q2 s+ [9 v: Q8 c2 \0 i$ J
numOfAbleJu += 1;& { j7 C2 U; `8 z
return true;0 {- l8 \1 \/ a" Y
}
/ b3 T+ P0 s8 @ private void cpy2deepArr(int[][] src, int[][] dest) {
9 r4 F! t4 h9 t$ S for (int i = 0; i < src.length; i++) {
. N9 f9 O7 ` _+ Q% _ for (int j = 0; j < src.length; j++) {
. B% U" C4 `! u3 n( q/ _9 w1 r dest[j] = src[j];
3 F& y2 u% F/ e6 |) ^/ l* Q }
& X( u$ o, \1 Q. s6 Q$ h3 A }
! N% R/ q3 Q* |. s- H }6 x# p# X* b" n# T5 D9 Y* }+ t- F
+ c2 L7 ?* O. {9 G' G! \' {- ~
public void printNowCheck() {: Z6 b; k# r' V& c
for (int i = 0; i < bs.length; i++) {
" |9 V4 k7 w$ z, w" B: a. o8 e5 j, ` if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
: G, _$ }4 R/ p) y break;
# x7 a C2 ?; A ~7 i# Y }2 g6 G) U$ _0 [9 [
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出8 \8 w0 n6 I0 e$ e
if (bs[0] > bs[1]) {
1 j% o+ ?" w* @ V8 A! A6 j8 I n System.out.println(bs[0] + ":" + bs[1]);
_) O* z* G1 A) W% u% x1 u } else {5 I9 n/ T% o8 \! [
System.out.println(bs[1] + ":" + bs[0]);8 R; k, ?+ D+ q
} }" ~* v: s9 O" s" z
}& j: B. D3 O: x
}
2 d9 H% \" B) o6 r2 W# e public void resetCheck() {# |5 P7 w+ w' H9 h& l
for (int i = 0; i < bs.length; i++) {
0 P. G# M, p9 W; y bs[0] = 0;; d. ]- A/ c: f' b3 f
bs[1] = 0;' I/ z. c# C( e4 {7 k6 L0 e1 p
}
+ K/ }) u8 ]1 R. |5 K, V" f: H }
" R- Q; [1 y9 Q /**
% n" j) Y$ X+ H0 M * @param args
, b/ d o# i; T: r; P [; _) s */
9 d3 K/ t: ^. O' | public static void main(String[] args) {/ T. E& H7 f# k. ^ N
// TODO Auto-generated method stub
9 ]+ Y, Y8 k- A9 B8 B% R GouGouShiJiFen obj = new GouGouShiJiFen();
6 k4 e7 Q$ s9 D7 b int[][] testData = {- F x9 O2 @6 l7 F1 s
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
8 ~# U+ y' {+ q) @4 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},8 [2 P; D; j! T
{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}1 _* U) H5 j8 X0 N$ Q) i
};6 J# P. ]! |& t) h! c. {
for (int i = 0; i < testData.length; i++) {" Y7 F* s% A2 i" w8 R. i. Y" v
if (obj.check(0, 0, 0, testData)) {
: z5 ?* E2 q. J/ J6 U4 F obj.printNowCheck();( }8 z% R5 I. F5 _* _1 C
} else {
n$ `; A2 W( c' i; J2 T" t System.out.println("Unknown");2 J+ Q2 z5 C9 L* R! ], b
}/ y% q# r# o3 C+ Q
obj.resetCheck();
, U& F, ~5 N6 O4 {; A+ m }) Z$ s, F9 }0 s+ i& c5 e/ _
}
" ~* b+ z" W) S
' W# F F6 W$ {3 r1 f/ z# Q} |