题目名称:蝈蝈式的记分
0 ?) w: A7 S' J( f" G5 m
$ f# s5 u# k7 t' ~3 I内容描述: % L$ A0 s* k$ F7 s# t# O/ Y, O
5 n; c! u. w5 K% R: M蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 ( @2 k. s% U2 O7 J y' X0 u! L) U
" G9 r+ R4 ]% X, S8 v
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
; Q' t( g, C, Z/ s
+ v Z8 }7 L6 p需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 , @9 o- n- k* ^2 J8 X
- C ]2 x1 J, ~7 P' `6 c& n
输入数据: / M, X4 _; M- r) u* v
$ r: d. J! C9 _3 g以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
9 Y" S- s2 A9 \) M- z% D! x' S" h B3 z" E
输出数据:
1 z' e* t8 o5 a1 _: I" N& U6 k+ c1 C: g, l: ]) h) n0 g! F3 H* V
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
! j% r! W( }: y9 O d& `1 o J; z3 N% }* u @% V
输入和输出结果数据样例:
" s2 I+ w, K; ?0 J
8 M1 ~7 J* I( ^1 I1 \; N5 o$ p) ?输入样例
6 C0 a. P& ^7 C
8 Z- T) j8 p$ @6 ~& \( D3 # H; V3 n, {" W [5 I8 k
& N5 f/ {/ M7 P0 w4 a
23
2 L7 ^4 Y1 b8 }9 b/ g8 C8 T. S6 T5 w: ^. P/ z
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
2 v% Y# f! h9 p$ o$ T S: ?+ \$ L* }2 i8 U% |3 N+ _
25 j& s/ r$ o! B% ^% c
0 W8 t: |, A+ g0 R* n9 3 8 5 4 8 3 9 8 4 X X X X 2 X X X X 2 8 4 9 2 4
/ z( `& X# _# d1 N+ Q# G# V4 o4 ?( x
43
5 b/ N( q0 O3 c5 o& \# P: [: a6 O5 R) v6 U6 W/ z- ~# d
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 # a+ s6 E ?, N
( x3 d! H4 o1 j: I* i- E Z, b, N! `7 F: Y
输出样例
4 \* U& V" i& u6 c# o
; C S* J4 p4 L21:17 $ {* o" j; i) e j! v
Z9 |& Q: b+ p$ X! Z( d
24:22
* x a) i" m9 r) A% m+ L3 s; E& Y) K0 U& i; a# a2 k+ K3 A
21:3 / {9 A8 h# S, x# V2 ^3 K- h
3 h0 c% k: W' x$ c7 h* PUnknown
0 P J8 J. m! U) [/ B0 B8 j6 t1 D; p
21:14 $ U( ?6 c; ?+ j4 o: T7 W$ A
" ]+ D# i% L3 Q6 J0 U
20:22
1 c0 f- a$ j% @: W# W& ^7 p/ W% a& l9 j" ^! z7 ~; D3 |# I
21:23
% t' G: F+ P9 E$ Q$ x' o) B( x- M5 _1 i" s! T( c; C4 X! f
21:16
; I4 m* S( z( {: ~, m1 X O$ o- Y% w3 |- d% V2 W1 G9 F8 W
21:9
, S: {) r) a8 a3 G! ~3 s& |! y% }3 ? 2 M1 R2 K9 Z. H% g8 y7 z
0 a: { s. h @* F/ Y
example: public class GouGouShiJiFen {
& |, m2 s8 a4 i% \& G3 `) Z, o, n. ^# D$ Q$ E# n
public int[][] bs = new int[5][2];//当前可能的比赛结果
& G2 F8 x; j0 B B1 ~: S// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果9 |- j, ]% O; Q( ~. ?$ ] X( n) p
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份0 ^# r5 C- c5 }7 u( n
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
# {& v; I7 g* W' Q public int numOfAbleJu = 0; //本行比赛可能的结果有几种( S- X1 s3 \& g; I
8 X2 ~" Y: \% i$ V+ i7 J+ T
/**
a& ^) u0 n6 |* z+ W7 _8 Z * @param index 连续得失分的index
A1 i! ]5 R# U3 {1 H% `, ? * @param scene 第几局比赛
- u4 g! a" M- n$ ~; Q# ~ * @param whichPlayer index处分为哪个选手得分% { q) V3 x+ X0 J
* @param record GuoGuo记的一行分
6 P- K' {( Z; f1 P * @return 是否是一种可能的比赛结果) C" Z# h9 b2 }: B" E
*/
. y' Y% |: Z" v+ r6 ^! R" Q public boolean check(int index, int scene, int whichPlayer, int[] record) {
/ ~- |' ?: o) }2 D( y int playerIndex = whichPlayer;( ?3 H" E+ O3 u) S* M& O
boolean isWanZhengJu = false;$ U w* ]9 O+ Z5 [ H5 _: m
for (int i = index; i < record.length; i++) {$ I& D' E% f! q2 {* u
isWanZhengJu = false;
( T: x! w5 q m+ T$ s7 T playerIndex = (whichPlayer + i - index) % 2;$ O1 x `* b5 j6 _0 {% W
bs[scene][playerIndex] += record;+ z' q# ?% p/ n0 @9 a: ?; b4 B
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局- a/ r4 P: h# n6 Z
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束7 b% c1 h1 s5 `' `
scene++;
3 e/ ^. T5 ?, w9 |: R# q whichPlayer = scene % 2;
4 m" ]/ r$ ~) @1 t% |9 ^" O% [) n index = i + 1;3 n1 g+ o# m: @3 W3 e2 U# M$ J
isWanZhengJu = true;( y- o2 f6 x' A9 b: L( c9 c9 s5 o
continue;
- c3 a; E8 }* n5 [; o- o } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
" a: l S! ^+ R2 s% B- {1 T return false;. y' T! y4 v2 h& {6 U' m: h
}! ?3 P# Z& i4 A1 v2 R; |
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的* t$ E( g0 R5 U- |; p& X) n
return false;. S' r2 O- `3 W% I* d6 e9 t7 \7 @; k
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束, P! t( x) I; \) }0 e
scene++;
: s6 K* P/ o1 A9 u2 @ whichPlayer = scene % 2;4 w9 K2 K( w" B1 p8 P. l( a) D
index = i + 1;" i/ C% S7 K8 @% |8 m4 \+ z3 \4 `. Q
isWanZhengJu = true;" H& Q4 \. s V, y( \
continue;% r' Z9 p* R) D P
}- Y" J* V# ?) f0 p
if (record == 10 && i != (record.length - 1)) { //下一个数分情况! A. C8 a& X- s/ O3 ~$ l# _% @
int[][] bsBak = new int[5][2];
) l; m7 ~- ] t8 M3 G% H" y cpy2deepArr(bs, bsBak);# V6 D; k. {) a+ x% J/ q% Z
if (check(i + 1, scene, playerIndex, record)) {. p" M: _- L5 o
cpy2deepArr(bsBak, bs);
9 P" F, D( j. y# C! A if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误 A" a5 j1 G _+ M, V
return false;! h O; u( i" }4 R; {# h# Z
}4 C, c- a, } Z7 J
return numOfAbleJu < 2;
' w2 y/ c6 V2 O } else {& V8 |! Q5 K% b _
cpy2deepArr(bsBak, bs);
( S" K C7 a+ a; n' c" ]" ` if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {' ^% Z# u2 F4 e; D4 A2 U/ i& l
return numOfAbleJu < 2;
1 R$ |9 o! I0 e8 T: }: [ }6 `; i U+ g, P/ r1 i5 @& v$ n% o. E
}
' b$ D- ~% S+ B. O7 S) ]& D return false;
6 A7 j# b" ~/ E2 `) J }% ~! V2 T4 t) q* ]* ?# b
}) p: T4 S% b9 J3 r( K! p& F$ K$ e. D
2 L D) @' Y( S! y4 H4 g: A/ i3 ?
if (!isWanZhengJu) {7 a! u9 d* m- D- J3 d
return false;9 n( g7 s* h6 F0 b+ T
}5 O# \# y' d% x6 U* e
// //检查是否符合五局三胜
/ T' S7 X3 ]% E// int a = 0, b = 0;
]9 f4 m* R* |1 [9 O// for (int i = 0; i < bs.length; i++) {4 w; a: t- [2 {* J
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了) ?0 ?6 G9 y# l W; `' K
// break;
0 w. c' k! ^: Q// }
* G2 ]& i+ `# }. W6 }% j// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制7 Z3 I* v" U! ^7 m
// return false;8 z" V' u8 t% Z/ t* T, V
// }
/ n( q* e# Y5 A9 t. {* q# P// if (bs[0] > bs[1]) {
1 G) J& T0 l5 B# ?$ f* G/ \ b// a++;
+ k8 e( H2 G* R2 h( @( K// } else {' R9 P0 B& Y/ B. P6 Y x% A
// b++;8 ]2 p; A& i# ~+ _( q. M
// }# y$ j" v# g) n$ N' S
// }
% c/ @2 @/ x. |3 Q: ^* i// if (a < 3 && b < 3) {//没有一个人得三局,故错误
2 c" n9 }" r6 f* l: @$ n// return false;! ?# m+ u% C P$ h
// }
5 q0 t+ o' E6 n& ?" I' A //只要有三局及以上正常结果,则可视为OK
& ~- i: A4 l# q8 y1 s* w/ s$ ? int count = 0;
- Y3 `8 P _8 m for (int i = 0; i < bs.length; i++) {2 w8 q: K9 I& e2 G6 ~! v) x# M0 T+ p
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
8 x: y1 \: \9 K break;
; f3 d* F! ]: @+ h. w }
! l4 K# c5 h$ T5 D count++;
5 [6 E- ?7 e" U1 W1 a2 g; e }9 w6 D) N- Y& Q7 p" W5 s
if (count < 3) {. H) x, F) B0 E6 X1 O8 m& u1 z
return false;* h+ `9 i* V! p9 h- k% z( q
}% I7 Y* m1 o, e0 {
7 \' z% J( o7 Y0 t* J( Y numOfAbleJu += 1;7 x% L8 B# O; ~1 L
return true;
7 t! Y; N. a0 _$ {3 [: O l; b# x5 u }
# Q7 k0 _( J. k, ~1 D' H private void cpy2deepArr(int[][] src, int[][] dest) {
* I5 Q: v3 ?* l3 c# Q$ @% B; g for (int i = 0; i < src.length; i++) {
# a" @- ?" Z/ D K3 R! H" D5 c: E for (int j = 0; j < src.length; j++) {" p8 b; s/ v. u( v
dest[j] = src[j];; o0 I7 h0 n7 e; k( q' t5 S
}2 A* v1 w4 k) O% F- y
}
7 T$ b# A: [0 z6 ` }
2 D5 S+ B4 R& i; k/ U Z ; R# @4 u/ I! y# l, g. B. h
public void printNowCheck() {
- S) J5 n; o) V4 V& j0 r; w) b for (int i = 0; i < bs.length; i++) {
- ~- A) b4 P* L' U) G7 f) Y if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了4 e& b+ C. B6 @6 Q# {' L
break;
) I' F( |# D7 N7 T) [ }1 D" U6 K4 u- i7 \: v" v* j$ ^
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
* _+ `1 \! s8 M6 ~! z if (bs[0] > bs[1]) {0 L/ M d g$ L F6 J' L! h8 x$ B! W
System.out.println(bs[0] + ":" + bs[1]);& |1 B& C6 D7 a
} else {) `1 m+ i# p# _6 z/ Y9 O1 y- b8 W
System.out.println(bs[1] + ":" + bs[0]);
+ n" d9 Z) ^* r8 K) g/ P& ] }
7 l& k* [6 A2 g4 u% H$ j4 ^# L }4 {! q# H, r3 O
}
- n; S0 v( a- U4 e0 M- p/ B) F5 N public void resetCheck() {/ b/ D, b% ]0 T8 \3 A
for (int i = 0; i < bs.length; i++) {
9 h$ d3 |: r' z; V bs[0] = 0;
' f! t* W1 Q: K, u4 t6 b bs[1] = 0;0 C3 P: J9 U- [+ P
}2 w# u6 l. _7 H2 t; A5 Q
}" I! a1 R: _, i! D5 s
/**
; ?7 T( `* u( c5 ]9 X3 L: G! _ * @param args
5 {. R- `5 s: i0 u1 y */3 g1 s3 X) B$ H0 ]
public static void main(String[] args) {
5 S7 N! p5 o( ?# ]9 X // TODO Auto-generated method stub
' S& Z- ]: {, s T+ G! U* p& { GouGouShiJiFen obj = new GouGouShiJiFen();
3 a- |# \6 E2 T; P# ]( J5 i2 ~ int[][] testData = {1 j3 [ t6 p3 i) b
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},5 @0 U2 B6 d& x
{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},
) z; Q, V0 n% W2 C! d2 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}
( S" B- }, U3 `0 R e# d };
! i N1 W! [* w6 I1 x9 W for (int i = 0; i < testData.length; i++) {9 h9 f- `# |# p. z% {: F7 f: U
if (obj.check(0, 0, 0, testData)) {
! L1 n1 J5 y8 m* }2 G; j5 R/ S obj.printNowCheck();/ W) I/ v5 O; ^0 Z, ^+ F+ g# E& g
} else {' R; ]5 s& u% k# E
System.out.println("Unknown");$ i* G# C7 j& A( r
}7 \8 z+ A# J$ m8 M; l7 V
obj.resetCheck();, ?. [- V8 u, B: \) N, k+ U: g
}4 i9 d: k+ _7 u; a. ?- D
}# B5 k I- X% l" H) B. n
% u7 Y5 L3 m- O+ R: M4 P/ B; o0 h
} |