题目名称:蝈蝈式的记分
G2 e! p9 A* W% I7 }" N. e- m; M' J# e: I
内容描述: 1 E7 u9 Q5 M% w0 S3 b. O
" H, z% e0 Y+ ^/ e
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 + t, Y: H& Y) D' @% Z& f. v$ r S
# h$ h, ^( ^: A* Y. K" B因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
5 [6 }4 h$ b% Y( E9 E* f
0 y. m) f' M$ Y) |3 s需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
& ]& G* p3 |. l& {
) H1 y0 z8 L1 X$ r" z输入数据: ( x8 X6 l# F1 j- [3 [* j
/ s; W4 U6 K0 L* H+ n* @以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
: Z! x9 q+ y* G2 k: c7 A# f2 ~
# ?8 y7 X& S- \ g( c3 K* _输出数据:
8 p: R2 G# {) T$ G3 O8 b" n+ k$ i# V# H
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
6 M$ c1 @* n- M. }* W! k+ ^' p' z ? K3 t/ o' u9 z$ W, ~& U
输入和输出结果数据样例: " m0 S+ j, K5 I! P1 x
9 u1 E/ `3 P, Q B. U% b输入样例 ( ~1 j0 b; K; D( O- O. j
; U9 ]) Z- D' ~. a3 |9 _$ Z! L
3 ' b3 Z/ x4 U. h3 Q
$ w! N) @% `: `7 X/ C' I/ F23
: m% o# d0 ~& `2 O, d6 H; `1 f- f1 K: y+ c& m
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 4 y* C9 c) W! S7 e4 t K( K6 A
?, T# b d3 t1 }' N( D- x$ L X/ T25 & j9 X( y: R% ~3 l% `/ O* ~
7 |: z1 `) @; U' `% 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 7 M5 o+ [/ m0 s# W5 L) ]
+ x9 Q! D0 h7 u6 r. d% M) t3 j43 8 f9 z4 |3 H1 U
U0 L4 L1 A) K) F5 g0 ~/ u
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 ( n# T& S6 s1 \9 e4 E Q, a
) M9 z0 ?( |4 K
/ `: E4 W- d y8 q- g I输出样例 " Y2 W4 e8 U, z! O# o
- S* L# V6 p! m2 n6 L" i% I( j
21:17 ' {) k0 ^! J% ^+ d& z2 C$ G
$ o; Z$ j! h9 R7 T$ Z9 A2 ?* w ^24:22 N, W" O5 B1 }' K3 B) ^9 @
" T5 ?1 Z7 m% U4 k. [
21:3 1 Q6 W1 K# J1 w0 S
+ H8 n* k3 ]9 v4 x# ?. xUnknown
) w7 r( g" ~+ I+ a: ~
4 Q5 z2 E! c1 s6 y. ]2 @8 K21:14
7 z9 @5 Y" ^$ u% K2 x" T R/ Z s2 l
: N/ J2 [3 t* @20:22
2 H/ o$ f: O# m5 j) [$ j0 z. l8 m- e; c3 k$ d. f
21:23
+ Y- N' s1 _* @7 x" k4 Q7 l$ K0 X% @
21:16 6 k8 a$ E/ A! k* R
- d4 W( |$ X9 A8 H
21:9
! p% s, P5 B. r7 g& N8 T
; @6 B& D3 }0 z H. `
0 X6 J5 D1 v8 Bexample: public class GouGouShiJiFen {& \+ o& X/ ~* E! C$ N3 W. ~* U
% l8 `9 s. ]2 Y7 r3 L) ^4 [ public int[][] bs = new int[5][2];//当前可能的比赛结果
. f7 b H' u3 v1 L// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果$ E# k6 r! i6 c9 D
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
" C; C8 Y$ \; c/ v// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown. [& `* E ]; n& C- [
public int numOfAbleJu = 0; //本行比赛可能的结果有几种
" J" y P: Y$ K3 P# I% p ; B5 T2 q9 k" X4 _
/**8 Z0 b- u2 o s7 t% S# P) w
* @param index 连续得失分的index, e% t8 Z1 v0 ?$ c
* @param scene 第几局比赛
& O, t' J# \& D5 {/ e6 H9 I * @param whichPlayer index处分为哪个选手得分
' ]. V7 l" r5 n6 Z# j4 Y * @param record GuoGuo记的一行分8 L8 M' Y" J, e9 M0 t+ m
* @return 是否是一种可能的比赛结果8 @) v6 l! o. }7 g
*/
6 R8 T0 M6 `# X; D4 x* k public boolean check(int index, int scene, int whichPlayer, int[] record) {
5 f2 E6 ^- H6 \8 } int playerIndex = whichPlayer;5 Y; W% F7 f! a/ H: h
boolean isWanZhengJu = false;
( `0 p4 A, U5 _ for (int i = index; i < record.length; i++) {) Q. L1 ^) J# d7 c7 v" A
isWanZhengJu = false;
Y+ c5 V# w' T3 V: B* P playerIndex = (whichPlayer + i - index) % 2;
/ n( ?6 Y. g; \( k0 j; C& O bs[scene][playerIndex] += record;
0 i/ s- X9 ?7 e if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局% Y c# U( V) D) X4 S
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
- K* D6 @% {: K) f0 d3 v& W" k; e- n scene++;& K+ C* i/ l; [2 f% U
whichPlayer = scene % 2;
* o9 i; i% S( q0 \# R: r index = i + 1;2 a; l' h8 y% d, \
isWanZhengJu = true;
: ^# D d* B# L* ]# o$ _& w# H continue;
: j" |( A" u4 n0 f3 b } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的; a2 c2 `+ w# ~1 d
return false;8 w' J8 v: |: e6 @
}. r$ _4 D! t! g# H
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的- c1 t' J: q7 D2 l2 |& p7 x( S5 y
return false;7 }8 k4 @, R/ m
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
! o/ r Z* H( S( q) w4 K9 S1 c scene++;
% d7 c6 b) e0 }4 w2 H1 @1 E whichPlayer = scene % 2;
! f$ H; W9 @ ` index = i + 1;4 A+ T# D e$ X
isWanZhengJu = true;' j6 C) o- l. w A! A
continue;- V3 x# L$ a2 I
}( [% T- M* O& M- f$ p$ |$ Y
if (record == 10 && i != (record.length - 1)) { //下一个数分情况8 Z. k1 [" t1 v9 J. D. T3 q
int[][] bsBak = new int[5][2];* ~+ Y2 Y8 U; Q% N J) }
cpy2deepArr(bs, bsBak);: b; R0 J |2 K4 H3 Q
if (check(i + 1, scene, playerIndex, record)) {4 f: X* c' i7 u6 g' y# O2 {2 F
cpy2deepArr(bsBak, bs);) J/ |# o8 I1 z1 W) C
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误& Y. e4 @* e( f. w9 Y
return false;
0 E1 w& U. T3 z2 I! M% t }
( ]+ o( B' {- Z% k return numOfAbleJu < 2;
) ?) y2 ~! I3 H$ ~8 A) b9 l } else {0 U @- B( ]1 q
cpy2deepArr(bsBak, bs);# p# h w9 v! O3 z
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {- D1 k; S" a* s
return numOfAbleJu < 2;7 b2 Q0 H$ ^( [6 R D2 H1 c, x
}8 o' U ~7 O, r, N: I6 s: d7 L2 ?
}# l; a! q5 B0 Q* j% Y: |" r$ n" w
return false;
- K- |$ D3 N' |- L7 q }5 u! t* \/ j: o2 l& K$ ?4 h$ N
}
9 z1 p, ~2 `% I% p
& d$ q7 \: d0 ?( z- S% [! p if (!isWanZhengJu) {
p1 T) C* C i4 `$ ?7 t return false;( Y$ Y6 Q# v) M Z V
}
* \7 v: |0 _; C M// //检查是否符合五局三胜 y. v+ ]! x( p* N
// int a = 0, b = 0;
7 F/ D* ?( q( E& s# q2 P' S' u( X// for (int i = 0; i < bs.length; i++) {
/ T% t8 a; Y7 } p# s& r) Y// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了5 v- L9 Y- M! Y9 V" ?0 R2 O6 u* e6 W: i
// break;
8 B" s3 d5 s; E+ U0 ?/ E/ T" W% T// }
, W' g) `! }2 j; w" {' U// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
6 b5 y9 h5 I. C, s7 D9 U// return false;
! e" [% _& X# p5 X) V* ^# {// }6 T) o$ d4 }; E. |4 K& N2 t* v
// if (bs[0] > bs[1]) {/ H3 _$ T, U1 h m* a% L1 i
// a++;
3 e: g% h! t, K @0 |; |0 B// } else {
3 @" s8 g( n( J* O5 I// b++;+ B* @. J: ~# `
// }' d- x% v' I6 L
// }
6 r% V* F0 `# C/ p! a: ?// if (a < 3 && b < 3) {//没有一个人得三局,故错误( r5 V6 b: B" o4 p i. U
// return false;
3 p" } U, P# _. |2 f; K2 {// }$ o+ e( J" K: _' c9 k# ?2 j
//只要有三局及以上正常结果,则可视为OK
4 K6 `0 q9 \: ?8 {6 ^& r' o int count = 0;
6 R8 D5 ?' a! H3 Y# Q6 b' _ for (int i = 0; i < bs.length; i++) {; P9 q T2 A; X$ |( ~1 T9 P
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了0 @* r$ z; T' z: [
break;
0 A' S% u: G; o' v! x/ q4 u& u }: ~+ s# c2 q7 V
count++;% e Z6 S$ E- o" f1 D, r- M, S
}
7 X7 b/ D, Y S4 R. N if (count < 3) {- e3 ?* \" N& N4 {& ]7 U6 c0 F
return false;
$ y' y. p; S* n% ] }/ N/ V8 F* v: L+ r( A0 [
9 k; g! H8 @7 H. m& v9 x v numOfAbleJu += 1;
( r& _8 Z/ F" P return true;6 r2 x9 L/ G d$ d' @
}
) a5 ~# x& ^0 T. J0 q F( P private void cpy2deepArr(int[][] src, int[][] dest) {
4 j8 T. {& a4 I for (int i = 0; i < src.length; i++) {& ~( V5 z+ W* ]7 J; R
for (int j = 0; j < src.length; j++) {
* C4 d. K' r. g s7 X9 T) U' z dest[j] = src[j];3 `/ t# f( \1 a4 p+ v. a
}' o" I8 k' y' D4 E P9 Q
}; _& a. S: ?: |3 \8 t% l) y
}
4 o0 ~+ B' `5 h9 p) \9 z , }' Z3 j3 W9 t O, t4 O2 t3 }
public void printNowCheck() {7 N2 e: Q2 l4 i3 N8 A+ P$ L
for (int i = 0; i < bs.length; i++) {$ P5 d. D1 j* {
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了$ _8 W/ F& T3 ^% ~$ F
break;
) J9 D% s' v" Y }
; F% q3 v% `& m( l. \ //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
: [. H) H4 V: |! q/ b0 F if (bs[0] > bs[1]) {
9 I* u: c+ g% K1 G4 \0 t System.out.println(bs[0] + ":" + bs[1]);
4 `5 ]+ f- i# j4 F } else {
6 I* f" C, g. [+ O# P7 Q System.out.println(bs[1] + ":" + bs[0]); M, _3 P8 U7 T3 B0 D
}
% ]' @& \! ^. ]9 l }; J% D* \) \; ^, X
}
3 l m# v; m/ S public void resetCheck() {- O5 k8 I! Y0 W1 B
for (int i = 0; i < bs.length; i++) {* F6 O( K2 y8 L# T4 ^- o% l" M
bs[0] = 0;8 q5 }% C' g, v v: c
bs[1] = 0;5 _; e# Y2 q- Q" z+ x/ ?7 p
}4 u1 G& w# J3 ?2 |9 a/ i1 n
}) u* Y5 T7 v: B3 g* h
/**% K/ l: P$ @# r( Z6 ^. L/ M
* @param args8 [0 M' A5 t, b' P! Z2 e# _
*/: T8 I* F4 [5 E- x# m( ~0 }
public static void main(String[] args) {' V" A% U9 |: `2 J8 s) s5 Q
// TODO Auto-generated method stub
4 C+ [/ g! F/ w3 b8 h GouGouShiJiFen obj = new GouGouShiJiFen();: }& J; A! Z! O- q5 P) U0 E
int[][] testData = {
; X% ^$ D7 q! w4 p$ g {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1}, ^! l3 N0 Z/ T5 S
{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},$ F6 c! P" i& G, 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}. Y7 g3 u( x. H9 ^3 {/ V
};: {1 E/ w, Z1 s* ^# w
for (int i = 0; i < testData.length; i++) {; O" {8 ~, i) `3 r
if (obj.check(0, 0, 0, testData)) {
3 {" P- U( R+ d: W obj.printNowCheck();) K" t) y0 O2 E1 Q) k
} else {
& C5 W4 k! c3 v System.out.println("Unknown");
2 { C$ N: R5 B/ Q5 B }
9 O3 n( w8 \# x4 v& }. ]3 e$ v! V" b( M obj.resetCheck();
$ @! w0 S- h0 l& E L }
3 H9 v: y7 N3 n3 _+ ^7 Q: V }
: O" G9 d, x- i* H! @0 b5 c3 A" L" i( m: D: @# Z6 y' [
} |