题目名称:蝈蝈式的记分 " M2 @( T2 q* O) v8 t7 q
2 d& @0 T w7 P0 _/ z( r- z
内容描述: $ Q4 r; o1 _ }- u+ G
% X3 c: g0 Y3 n% S
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
/ n- s4 J- l6 p+ N* t+ |" e- ~' i1 g; l* V2 G2 R: ?
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
; v$ b3 n" v6 [0 J7 A
8 [$ y( C7 T$ b @& r$ r需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 % q( c( ?% @ L& _, \
8 u4 {- U) U& Q
输入数据:
: I" K6 | H) k
: k, v9 V2 g4 \& t以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 1 G! d. \9 o k k: r1 |
4 n, x: P% X8 z% [. ^
输出数据:
! h' h, G. [7 }- F. Y+ |+ M2 U( `$ s$ u! c3 a0 R" n a
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
) D5 u3 D- C7 K r% M/ U. f2 U3 f: S" T* x1 k6 c
输入和输出结果数据样例:
{. \2 g6 ^; b9 N+ y% U4 j! j3 `. }. y3 t5 L) i0 T2 {8 \
输入样例 / ?( P n. o* E/ S! W
& _! G2 Q7 M' Q) q3 4 k' W4 B% p4 q3 u
1 o8 k! Q1 s8 n; z* b" ?23
- y; X0 b( I- w: w/ u) C. z7 n* O: Q/ ?0 q. i$ d7 A) M7 S
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
7 q3 [) U: I$ X8 B) q/ F6 V; W
1 S' w, k0 }. K25 1 ~1 d$ ?5 s; S7 C5 x! y
) X; I* [# m1 q# ~9 f1 i9 3 8 5 4 8 3 9 8 4 X X X X 2 X X X X 2 8 4 9 2 4 $ F* E; L5 p0 d! P, p
! E. b/ g) F( o; B
43
, z% [2 n2 g8 z7 _! w! r Z, X2 ]
O8 `9 I' c* J( L9 v7 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 ! K& D) p$ ~) j9 _
! X8 Q6 P1 n/ I2 T2 ~
4 D; T- T! @. }4 _5 L* k1 T
输出样例 * X1 n3 G& i9 H
/ l4 [( N: j9 x5 z3 N+ _
21:17
9 W8 j+ R6 |0 u* p) _9 n+ w5 R2 ?$ c9 T; m3 g+ H; h: \
24:22
$ D1 h- U1 w* \. B! L) s9 g. u- P4 j! Y) ~. {
21:3 ( K9 M9 Q8 t( W1 H
% V+ Q& k% P* Z( y7 y
Unknown ! b2 c" @5 C- b c$ n
0 M2 V3 |, l9 \! F# ? Z5 @- v
21:14
# c$ h$ M& R: z3 J4 }
) K4 Z/ C( M4 m0 B7 o& I20:22 ( ^8 m/ h. q- K2 q; w
6 U: g6 K) c5 p! m) F0 W
21:23
: G6 Z4 ]" ~% z" a4 B
( ^; g5 F; B% E21:16
- f& i s% u* d' Y; r$ \9 {( h4 y. z5 A. T; j) P- M
21:9
& Y' v+ ^2 e R" U( m6 `$ V3 o. h ; s0 o$ ~1 R1 W* I/ O1 L& H
& B; h+ h! r& _7 R$ m
example: public class GouGouShiJiFen {1 E& f. x! ?9 u! u2 W
' n' A1 L& E7 t) s. T
public int[][] bs = new int[5][2];//当前可能的比赛结果4 I* S& t& S: c7 h4 y# ]
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
# C% N. U- T. S' a; w4 T' g// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份5 I: o# J! E# g
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
$ z4 C9 W: q: ? public int numOfAbleJu = 0; //本行比赛可能的结果有几种
$ V4 o7 _+ J+ y4 v k$ y9 s. `2 z# `
/**
1 b. s8 ~0 o8 w" W6 M4 D: E" Z9 a: P * @param index 连续得失分的index
4 l6 c! \2 D5 r4 r * @param scene 第几局比赛
) P- P( m7 b3 W) M" t3 [5 `7 ? * @param whichPlayer index处分为哪个选手得分% i/ z/ r+ o$ g- b7 f
* @param record GuoGuo记的一行分7 F. R. o! J4 y5 ~6 ~$ T; I
* @return 是否是一种可能的比赛结果
1 r3 _: a9 P. |# }3 y' d* k5 W */
|* H) r1 e" }& u6 L( Z public boolean check(int index, int scene, int whichPlayer, int[] record) {$ Y$ o6 R+ }! z. @5 k3 I( u- O" w! g
int playerIndex = whichPlayer;
" b$ f7 K" \: m5 K& d2 f boolean isWanZhengJu = false; K% W f4 p- N. x2 R: O/ T; T; z
for (int i = index; i < record.length; i++) {
. P n# y7 t8 x1 v5 l isWanZhengJu = false;4 p1 q8 o/ V. B
playerIndex = (whichPlayer + i - index) % 2;/ Z ^) i$ [" ]* R# x2 R2 ~/ V+ V1 c
bs[scene][playerIndex] += record;4 f' [$ [' @" p1 s2 p6 [; Q
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局( C( ?" P. C* C( r" s0 i/ _: Y
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束3 R0 A# R: J M- D/ S; K! w4 R
scene++;: `5 L" d2 R/ ^/ z
whichPlayer = scene % 2;
% Y9 c- E+ P; e* w index = i + 1;7 } K( z/ I# v) R3 S5 t
isWanZhengJu = true;
! ]7 p+ X9 K% }6 L! v8 M4 X continue;* h5 n1 j* p5 K1 H
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
2 `5 o7 ]0 P$ E- C return false;5 Y* O5 H! Q' ?" B
}; R# g! [9 \9 s5 [" M8 Y7 @% B* [
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
) \: `- N9 j& g return false;
+ l- P1 W4 `5 d+ }/ d4 j } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
# d9 Q1 x5 A- p: v) V; e/ @; ~: J scene++;
+ M0 }, L& U3 ~/ c- R. ] whichPlayer = scene % 2;# F# i ^. L H# t) J
index = i + 1;) {4 m% K6 q0 c2 Z
isWanZhengJu = true;
9 n4 X& j5 }2 Y continue;* t) ?$ [2 J4 y7 E+ s4 S8 k
}4 u9 m7 M- L: }+ A9 t) |8 w% W
if (record == 10 && i != (record.length - 1)) { //下一个数分情况% \6 X8 z; ?' j
int[][] bsBak = new int[5][2];+ t0 n: l h9 W7 Z. }# H3 A$ j3 |
cpy2deepArr(bs, bsBak);0 Q; o& e, I+ r- f# |
if (check(i + 1, scene, playerIndex, record)) {! v3 Z N% R h
cpy2deepArr(bsBak, bs);
' J* k4 U' x/ m$ h1 f) M c+ A, Y if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误- r, [" T- m" Z1 z" _& J7 q* E( C) l
return false;! C) y, \& O0 G- K
}* e7 n% Q# Q0 A* D3 W y
return numOfAbleJu < 2;
2 N |" l2 R, m' B. A } else {
0 j- I$ N0 g" ? cpy2deepArr(bsBak, bs);
9 A9 F- u- T/ c& h; h1 N5 g4 M _- f if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
6 V C% o; n* k. e* ~1 n. ~ return numOfAbleJu < 2;
- k3 m9 \2 l; y }% w* F( T5 e6 {3 v* V& R+ q
}
" f# V* \, r6 |7 V2 v return false;( Y3 S# b) t' A( [4 }
}
: H# m8 X, }* F# ^, x8 R2 p5 r" M }% P: C9 N; O9 f/ v0 |5 p0 r6 N/ `
5 ], b/ l+ u ]7 \* g" l8 O if (!isWanZhengJu) {, M3 r* S- H& {$ u/ F
return false;
5 E) ~/ {7 ^2 Z2 L5 ? }
7 |5 A4 _$ ^9 D, k; g// //检查是否符合五局三胜
1 u9 _, M1 i2 q L& x// int a = 0, b = 0;6 P9 Y: h9 z3 _6 Y! r; V
// for (int i = 0; i < bs.length; i++) {
{& m( E }8 g) E// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了, c% ]# @% b8 c0 d. I' k, z% _ [: U$ @
// break;
& _* j2 Q0 |- q) V0 {// }( I5 ]2 D! A* N/ F# k
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
v+ k9 B5 T( \// return false;
0 U1 r, I! O: \$ m$ m: A* j; J0 P// }
t- ?/ |8 z/ o6 X# a( ^// if (bs[0] > bs[1]) {
M K: K, z2 _" x// a++; A4 P( @: r: O% G& U7 W( r! V
// } else {
% A- d4 x, E/ p4 v* _// b++;
_) g+ G. D3 }) I' D// }
, h3 ]: r9 B2 R w- L// }
0 J( p& U8 m! ]6 O1 p// if (a < 3 && b < 3) {//没有一个人得三局,故错误
( h1 I. V& _$ v0 j4 c3 O// return false;
! y# O4 z( n6 E, b3 }& X2 `+ F// }* u* C4 Q& n# c% h
//只要有三局及以上正常结果,则可视为OK
5 B9 y2 } s$ W$ x# [* T5 R6 b int count = 0;
- `. n t& t( M6 v1 E" W for (int i = 0; i < bs.length; i++) {
3 H5 C X2 c& A( W& R) w if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
" j! N+ m# h7 K* Z) r1 X+ t break;% ~% j+ |% L' ^# @
}
8 ^6 P2 k- S) i1 d9 \$ z. Y count++;- J$ E+ {7 Q% Q; d; l
}
# D+ U7 P- F. n, h if (count < 3) {2 }1 `$ g9 d% w$ q4 |
return false;0 O# H* W, s2 h0 V
}& q/ O/ E& s5 p+ o
. c; u# n4 m/ n$ E9 D8 I9 H
numOfAbleJu += 1;
% f; f2 d7 E, f+ N6 Y" w. Q& _ return true;: w" g+ H- R" ^9 J; n
}$ q, L6 `0 P3 ~' O4 r x" K2 a6 R
private void cpy2deepArr(int[][] src, int[][] dest) {
1 S9 a$ `' M/ V V* h$ A5 h for (int i = 0; i < src.length; i++) {8 h5 w, y3 z# s4 |/ |0 ~4 r
for (int j = 0; j < src.length; j++) {
" J) ]) W; r: x dest[j] = src[j];! ]6 X3 C# v9 C% Y6 X1 ~0 R
}
8 I" O. g, P* H# ^2 v) V6 x }5 f; q; t1 {. n8 ~8 F/ b5 v
} \' Y( }) y5 g
/ s: k2 c9 b1 s" f4 Q) Y
public void printNowCheck() {! X5 x$ G: k: W/ K1 B- i$ A
for (int i = 0; i < bs.length; i++) {
: Q4 ^6 a0 r) C; K3 G0 u# j if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
4 U, ]+ c# l9 _* T- C( n$ b+ h break;
( E" M( k- r, l% F4 ~/ w1 m3 W }8 p& O: z. y) E6 x j
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出4 x4 n9 G' @( F1 \
if (bs[0] > bs[1]) {
) ?) K4 Y ~1 j6 R9 J8 l System.out.println(bs[0] + ":" + bs[1]);- ?, h% D& } U& H P
} else {; }% w7 h7 r6 ~( ]
System.out.println(bs[1] + ":" + bs[0]);
+ i! }7 A7 S' V3 b0 B* ~5 e }
3 Y1 s2 z/ U f! d4 T" S }
t5 o' K4 y2 l- C) N+ @ }
# B d. E r2 c0 ?+ g, u/ e public void resetCheck() {0 i. w8 Y* v: f3 z. z# s& j
for (int i = 0; i < bs.length; i++) {
& j/ y4 _7 S1 G- h& s bs[0] = 0;
2 i4 q" H, U' }1 s bs[1] = 0;
8 e# d7 y. e& R }, W' s" h0 m8 @, {# T7 o3 t& d% b
}
+ U3 g% k3 `) r4 K /**1 _: f* t. c# T$ g6 v$ v# N
* @param args! s7 M2 c) Y) V, f8 a
*/5 x- Y+ p( y3 H. V9 t5 Q% P& t( h! ^
public static void main(String[] args) {) a! \# w2 N& Q- F% n) J) e0 A' c9 v7 I
// TODO Auto-generated method stub1 h; V4 l a3 j
GouGouShiJiFen obj = new GouGouShiJiFen();, F s( q; D' ~; D) e9 L
int[][] testData = {; \8 |( ?! g+ E6 n. r/ R$ f
{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, g( G& x/ y6 n! | {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},$ d& `7 ~' S( U- J
{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 U1 E3 o" i% {% [( M* a: o };
5 i" r9 O# x* {+ M/ J( d5 x# G for (int i = 0; i < testData.length; i++) {
2 e; U3 m; Z N/ T; ? if (obj.check(0, 0, 0, testData)) {
; q ?! y' i% x obj.printNowCheck();
/ W5 z; P6 I% l/ H$ b% O, z } else {) R: l9 }( ~ I! u
System.out.println("Unknown");- [7 X. s: J. g, B' A; v* u2 \2 ]
}# F7 Q, J/ q/ i( d1 o' ^6 l
obj.resetCheck();
, v* V+ @9 }1 H& U$ |- ? }! |: D2 e. x/ x
}
C- @4 c! [" s* |
0 p; t0 J2 U6 V} |