题目名称:蝈蝈式的记分
0 M2 i( q# Z9 O4 f8 P3 G) q) }/ |- t, N- X% n% J$ U5 O
内容描述:
' g# e4 j2 y. z1 m V( ~- _* P7 _$ u
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 $ U w) D$ @& K; x2 w6 {9 d
& ~4 E) ^( L: i$ C3 i/ l+ I因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
, n" l: r6 k" [- J9 j/ ?
% `# [; Z) U2 q+ [, b需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 , Q0 r, \5 m! A
. @) k9 r+ z+ }# x6 W- O
输入数据: 6 b0 o: q6 u* i" |7 d; `
" K/ [+ m, t" d+ N* t4 B0 t6 m以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 ) ?. b; L( I$ J" o7 `
: l. G: I" v9 B8 k/ C输出数据:
& n2 {* l% Q$ o! \+ N, M4 {: g" Y! Z& s& Q
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
$ D# H8 \+ R' s# l( F! g2 {+ \: F; U0 F/ K
输入和输出结果数据样例:
5 x3 _: Q" V% ~6 J f, }; x* u0 {4 [, w' w( J. T2 Y: Y5 O e
输入样例 3 X& N. ?: {& `* P" r
/ v' o. C& M, Q1 V/ }( N, z" o l
3 - C: J3 X& J' E% }- [; r0 h
: \4 R7 c* X% Y4 m23 " s& U4 [2 x5 _# L" a9 z6 V
9 f% s! y& h, V3 b# ?! C6 q
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
0 t4 Y! D K2 h* f
5 C( ~7 O' [% _8 l3 d25 6 e" X0 `6 l& o% E6 t( D
- B& S4 I( C1 B. J, [- d! b
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
+ @0 @; b+ \7 M& E5 _
/ W: k; `0 V7 V+ E/ Y43 " e4 N" O' k& m& B' }8 C
/ [! G3 K: e* E6 L
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 j$ g4 v0 {7 W Z' h- O
o* j& Y! k7 L( H, Q: B
( T: { [4 @2 F/ ?! y输出样例 5 ^! e* }1 W7 A" e7 C8 G( y
* `0 H. m0 X" R+ m# i# B; ~
21:17
7 }6 f6 n& a' W/ ]# f1 n- U8 S$ R
8 {9 k* L; c; L$ n24:22
/ }: T2 V, y2 [8 a/ t5 [* U9 a) v: b0 \0 o
21:3
2 h( e6 ]* e0 I1 u, e" u
/ x1 v) F' {5 [' N5 bUnknown # x8 ` q" {0 g
% H ]' p5 B( \, l2 }7 g! _( a21:14 ) D& e" x3 Z/ {) X: v
# d2 j1 M6 X; e4 L, h
20:22 , w- x7 e) k3 x1 Q/ G _7 m7 K; b
. t7 L+ D# Q( m
21:23
" }- v" T$ r/ @; G8 ]2 m; ]1 E. d) P/ S
21:16
$ S+ z; `! T8 M* x# Q2 f+ B; M7 F' H( |. C: _5 z
21:9 5 P4 |" Y. m! D, [! @
' x1 c. R, Y9 L. r1 J
+ v# y+ y) j1 c9 N3 A# ?example: public class GouGouShiJiFen {
+ u [: b+ F+ Q. P0 ]3 N; F
4 c$ p/ Q: w. ~; f1 E public int[][] bs = new int[5][2];//当前可能的比赛结果
P S& l% Q0 M5 X* V// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
) i0 C# \/ q0 e; m// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份* r) K2 A- H+ K+ @8 Q
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
- U, V# h/ a' ?4 C public int numOfAbleJu = 0; //本行比赛可能的结果有几种
7 r* `6 [. o! B6 G
: v: A. x* ^, {& M5 L. H+ Y( ` /**: R9 l5 B) A) K; l% V) t
* @param index 连续得失分的index+ p1 p5 H7 E' Q; [
* @param scene 第几局比赛" c9 s- i8 O' g& ~% s) T
* @param whichPlayer index处分为哪个选手得分
% C) @( }5 p7 P2 r1 M * @param record GuoGuo记的一行分& C5 M1 b* \6 K2 ?
* @return 是否是一种可能的比赛结果
: q" M& c6 g; _ |. m/ [ */+ ?$ L$ o; M4 Q7 a! _! Y+ E! P) _8 V u
public boolean check(int index, int scene, int whichPlayer, int[] record) {
- N8 z l1 S7 \ `. _4 r: _+ T0 B int playerIndex = whichPlayer;
& O9 P* V* \0 L# A, P6 ] boolean isWanZhengJu = false;
2 K: ]/ P# z' o/ } for (int i = index; i < record.length; i++) {$ K7 I# o' v* g
isWanZhengJu = false;
, J. Z+ V9 k0 z+ T# m3 p playerIndex = (whichPlayer + i - index) % 2;2 ]( l# @# U+ Z4 I3 k( g" N
bs[scene][playerIndex] += record;
/ b/ P- y4 c" [ if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局, u6 [! Z( {, Z9 ]. A% f, \( ]
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束5 b% v3 ~8 |9 K& n) ?$ g ?
scene++;/ O4 ]/ R: s# J4 u) p
whichPlayer = scene % 2;: k3 ~/ _- ]; c4 R) i
index = i + 1;5 @6 w: y0 M4 e
isWanZhengJu = true;
' C' @) I& |1 g# [ continue;
# ~ k/ S9 R2 |3 T3 D9 Y4 q: _ } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
* G6 H+ F1 R% Y# K return false;
* q6 g- D- a) f) ]8 P0 V/ @- d U }
, u5 S; ^% O: o8 Y D } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的& o" @4 Z" F z- s
return false;
% R1 S' ~. E; E } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
+ S+ y( Q# e C9 E scene++;- |( N% m! h: k$ n7 w1 t# y# s
whichPlayer = scene % 2;
; ]# b) H ]+ ]3 \/ {1 t0 P index = i + 1;9 Y ~( a" Z& ~/ B. }% n" G
isWanZhengJu = true;+ _0 Q' ]. `& v$ ], S' m
continue;# O u9 o- E' j& ]; G
}% F7 g! e- _0 \9 i
if (record == 10 && i != (record.length - 1)) { //下一个数分情况
* d3 t1 L+ C" E int[][] bsBak = new int[5][2];* C+ o: O/ m- d) A- U* H, m
cpy2deepArr(bs, bsBak);6 ~2 L7 a: Q0 x. N6 ]; T. d
if (check(i + 1, scene, playerIndex, record)) {
) t/ V3 b, O/ y* @ cpy2deepArr(bsBak, bs);
p. N3 f' {* v( ` q if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
6 E0 Q9 Q! P; G; `7 z. k return false;3 D* V* _% B3 a& r/ ^, S
}1 f/ |1 X) V+ I `* q3 Q
return numOfAbleJu < 2;& n' _6 w% L7 ?( [, P9 W: a R8 c! w1 N
} else {+ n% [& `5 Q4 D2 M% M1 w
cpy2deepArr(bsBak, bs);5 @8 \$ b$ \& Y& E! f/ O
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {& i9 C) v2 h$ g! e
return numOfAbleJu < 2;# h+ M( i) @8 y: `. E6 o
}
' c% c$ W- w1 E9 d ~' F }3 m4 X8 F& I1 q7 E1 I
return false;
$ O$ n* I: {2 p: p; u3 A }
- b* s! l' P: @; w5 [/ x5 P }7 p9 C. G# w8 u; w8 ?8 z
& ~/ d! U& A1 `4 s2 K/ y% E
if (!isWanZhengJu) {
. s- ?" G! y. P1 y$ n return false;/ r3 i# X$ }( [1 g4 r1 D
}% I2 A2 v1 o$ R$ T
// //检查是否符合五局三胜6 W; F5 n( Z/ F: N) G! ^$ J0 ?9 X. u
// int a = 0, b = 0;3 `, x, J3 A* j+ y4 U- u
// for (int i = 0; i < bs.length; i++) { F3 j, k! }4 P% R
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
: a7 H( E$ G3 |! F9 B// break;
1 w' q) t( {' @5 i3 z// }
* ^" G' C3 ^7 c( [1 ^1 L// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
- Y* R& v0 Q* z; ?! J! Z- ~// return false;
% J4 w- ^3 s5 g# h% ~ Y$ I" W// }
) `" J. k' n, v1 e- ^; o// if (bs[0] > bs[1]) {# Y4 x4 k* c6 @( _% p
// a++;
; F, N4 U% r0 V& C% Y// } else {/ m; [5 ]9 T, Q" r
// b++;. t h* J' O- ~5 B5 g8 H
// }
: v$ Y& C( J$ @// }
3 ~8 F, ^0 k# ~, h% R// if (a < 3 && b < 3) {//没有一个人得三局,故错误
1 ~+ \3 o# _3 ~// return false;
$ ]; _9 D* T) j+ c* O// }* H& J& b( _; _/ U
//只要有三局及以上正常结果,则可视为OK/ B' i+ \8 f) a! c: v
int count = 0;# _' e8 \, q* h, |2 T1 C% x
for (int i = 0; i < bs.length; i++) {* b- ?" x& W! k* o4 ^
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
7 N: C8 `( K3 m+ |5 O4 A break;
' G: Q, w, b+ x5 }' S3 t }
* L1 ]$ J- ]" U! y, V6 ?$ L count++;
) S* c% n! ]7 a, \% H1 }! B }
* E. Y* [# \- x6 I if (count < 3) {2 P; w- {/ }1 \. M
return false;
5 I+ U5 o2 k4 A }5 `, D- R8 {3 G: C$ E" v1 |) V
9 i6 z. \( g- }0 i numOfAbleJu += 1;0 H6 N) Q3 l" u
return true;/ X5 V, d, T; f# k
}
0 t6 E: g! F) e1 @: } private void cpy2deepArr(int[][] src, int[][] dest) {
! I5 h. o3 A i for (int i = 0; i < src.length; i++) {
9 J4 W/ V' N/ }& z, L, ] for (int j = 0; j < src.length; j++) {* h6 Y, E5 Z. ~' d0 u' @1 s. ?
dest[j] = src[j];
0 W3 j2 ^, `. x8 D$ C } }
M# ]4 _1 I) _# u% v }: R; ~* |( L7 r+ [8 F1 |1 C
}4 \! Y8 ~! |* [9 u/ y. Y) M. g
. B1 d+ H( s, s
public void printNowCheck() {. u+ R/ q5 n/ y/ ^6 b" `/ h+ K
for (int i = 0; i < bs.length; i++) {
. o* O* u: ]) ` if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了0 \2 P1 l1 n0 j6 C0 o7 B+ \
break;1 l, _ h! }3 ~7 f2 h# s
}. u, V7 r# L3 ^; s$ C
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
6 X6 T" G9 h7 R( x7 l7 O [2 v0 U if (bs[0] > bs[1]) {% g5 {6 d; S7 T% ?* S+ a
System.out.println(bs[0] + ":" + bs[1]);
5 u+ Q' @; H, L G3 F } else {
, w8 {3 q- M" i% W+ y System.out.println(bs[1] + ":" + bs[0]);9 A# x( K, R! s" U ]
}: J9 x! ]# x }$ }. j" A
}$ }) e L: F1 G/ {
}# `2 ?$ ?# Q/ p2 N
public void resetCheck() {% d7 k/ \6 j: g; D( w
for (int i = 0; i < bs.length; i++) {
: a0 e" q, f4 E8 F; d5 H: E$ \ bs[0] = 0;
+ O1 v s! r- G bs[1] = 0;
% a) H. \/ s, L3 n }
+ p# S2 r& \- M }
X/ _& L8 t/ s3 ~$ o$ F) ^ /**1 P& \4 g2 j+ {2 n$ D9 X
* @param args
0 s" W0 [+ l A+ G */6 F% j. ~8 C# e1 c
public static void main(String[] args) {6 W6 h9 Q7 f5 I6 _
// TODO Auto-generated method stub
% o& a) [8 |9 J6 {$ b GouGouShiJiFen obj = new GouGouShiJiFen();& p6 m+ a0 |, K
int[][] testData = {! H- q7 L& {/ `7 t) r) X
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},# O I" A! Y( Q2 _ W. x) w2 @
{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},
2 z& t+ V% j$ o" k% D% i {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 H7 I: Q% ~3 ? };% c* o* ?, F- i1 V% O1 m
for (int i = 0; i < testData.length; i++) {1 U( h) F# [5 o3 S
if (obj.check(0, 0, 0, testData)) {. \3 o- M- L7 {1 X q" M
obj.printNowCheck();% y7 C$ S( g5 O- T l( S$ g
} else {! y; |& V5 R: y" n- l& P8 V) K
System.out.println("Unknown");
2 o* a3 d# L, b1 t! K- S }9 Z, m) g* v/ A0 }. \; h# |
obj.resetCheck();0 _, q( U; o+ X3 |1 B+ j
}
9 k; |* r5 q# d5 G x; F; x- f }
4 F' Q2 h& p5 w3 _$ S# F8 B4 n& v6 A6 |
} |