题目名称:蝈蝈式的记分 . I* \7 i; F! N# @% l& S/ W
: a. B" c _' c: v
内容描述:
2 C* I; I' h v8 o0 ^( h
1 A4 ?6 y' k. c! a* Z- V, \蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 * b. G( h' \ i
0 b! c" n9 _7 D3 T0 z4 m8 L2 i
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 3 ?+ r! m, o' a. U
/ M- k% Z4 z& b) P
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 9 I% T* _8 ~- G4 f
; [/ X" v7 W8 w: h% L2 m$ L输入数据: ! k. [0 q8 j) F @
7 I6 ?/ z' S i& h) K* I: \, f
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 ( g( A- }8 n6 v
8 U! c, z4 m4 B2 y; E输出数据:
1 O# u8 y z; Q1 n9 U
* E k& [( m8 w8 @9 B# [7 Q相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
- |' Z: C% i, \4 o1 c: d8 A6 i& P" |) U. Q$ }
输入和输出结果数据样例:
% M5 V+ ]" W d$ N* o1 k3 i1 f
3 G% }1 P! E/ W/ X& h, A3 @输入样例
. Q% ~9 F0 N+ z- k0 s1 T" }) s+ @
$ q2 I4 d: F" {1 j8 {5 z3 3 _ P/ ` r0 M) S0 U# o
% n/ q; u' T9 g, b3 e" ~; X1 y
23 ; J! t2 P: e" G2 n
$ Q5 B! n9 T: ?# l0 b' H0 N
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
: r' u+ E+ Y8 P" n3 @5 `: G# u5 Q% E; V! _( }
25
' Y( B0 q+ c f0 S$ O$ u
1 }# [ W3 v6 S- F# V" N( s6 O, x9 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: ?* C: ?# [: r& k# S
t# Y3 X" P3 y3 x43 E4 d' L9 z) d& n
, w: L# l$ h" ~7 Z& |2 w) C4 u7 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 - c& }: }2 I9 z: B# c6 F8 k
9 n9 r _# C: j( U
1 r3 Q0 {/ U2 d; N* W
输出样例 - D; P2 F1 y5 i: N; q
% e B4 k5 M4 F* t) f6 t+ i( n21:17 " X, D" A x6 Y U- [
4 d: h$ N% q4 U$ V" l9 u. B24:22
# a' Z1 _& F N+ V
N$ D& B1 P; a- C' f/ \21:3 7 r; r' |, H6 ~6 e/ ^ I/ O
* ? @+ e4 B+ k1 d; G
Unknown 0 X; o3 ^$ S6 r/ o' S
7 e& r# B* ]" W& F/ h& l
21:14 / V$ ]0 E6 s5 ^# `$ ~* p' g9 X
3 n4 N* P8 Y; j7 c, I- d20:22 + }/ k; r! s0 T7 d4 J9 J
c. \; g& J$ [' |21:23 ' t6 z; }9 S3 P) `" N1 ^$ r
& x, A* e2 P5 q) [21:16 . y: h" b) i& M C+ ~9 Q5 y8 d
% Q6 P; }8 R% |" k$ x) ]
21:9 ' L0 m; D) Y( e! Z( T
/ ~# q4 E; t7 U# S* U& F( I/ `3 L- P
$ l7 O. N! t; Q% `2 h- g) k0 L# bexample: public class GouGouShiJiFen {2 a5 g% P/ }) v# G( Y+ ]. ^% C4 k3 @
" U: y. @3 v( u( G. E0 R+ B4 n6 L% p public int[][] bs = new int[5][2];//当前可能的比赛结果
& p8 d; I7 c% [& s" c4 t5 e// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果/ i; I4 q) f0 Z( }
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
$ x6 w3 B9 d. ?+ r// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown+ z' q) W6 r( {- ^
public int numOfAbleJu = 0; //本行比赛可能的结果有几种7 f% F( Z- ~ i9 Z2 i
- N! A" c7 I9 a: q! J; g2 P
/**
. I7 ~/ @. E5 U7 [7 F- V- M * @param index 连续得失分的index
; p; r* }; a5 z+ F! ]- s * @param scene 第几局比赛
' a/ t+ B- `" m! e- S * @param whichPlayer index处分为哪个选手得分
/ ]3 m2 Q9 A) i * @param record GuoGuo记的一行分# t; \7 q- ]) _4 A/ q' z) h
* @return 是否是一种可能的比赛结果' m2 {, _, p/ x& r
*/
4 ^2 E# s6 ?; Y2 ` public boolean check(int index, int scene, int whichPlayer, int[] record) {
9 a: n. ~* B+ [/ U4 ? int playerIndex = whichPlayer;
1 ^. V4 `5 s/ _- h boolean isWanZhengJu = false;8 a, {; `1 P; a( ~. I
for (int i = index; i < record.length; i++) {/ S/ l$ O- h; Z/ D
isWanZhengJu = false;
5 a& H& z) }6 F" n playerIndex = (whichPlayer + i - index) % 2;8 @0 `4 l! E' L% B _. C2 Y( V& i0 C0 f
bs[scene][playerIndex] += record;4 B- C, ~5 h! H: u
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局3 w3 X6 q% B* D& E8 o& T7 _
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束0 e' ]- }( D, {. g
scene++;
6 y) j5 ]" L: i9 D) w+ x; [ whichPlayer = scene % 2;
' d" a1 w: U8 X2 Q index = i + 1;6 L9 @% s2 M% N8 ]1 U) \! z7 E
isWanZhengJu = true;3 M7 L# V5 {$ L: K* |3 c3 M) r
continue;
4 L8 Q0 x0 W. Q8 f } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的9 D: s0 I7 z% x3 `+ S3 r
return false;7 E# E2 W+ U( c. v
}' _6 j( n9 d' `+ N- W% U8 a( \
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的, T: K; i" `) k
return false;
C$ p* a! v, ]. V" y# p9 r( q } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
: y5 Z$ K/ _% w7 i) S3 f scene++;, O1 V# Z9 v" b# {
whichPlayer = scene % 2;
+ r2 q% _2 I2 R% K( E index = i + 1;
% S2 m$ w8 `5 g% P5 ?, S8 z/ F4 B isWanZhengJu = true;
, b3 ^# k8 e5 G+ j4 T1 { continue;) Z( h" }' x3 c z& g# w
}7 i& p) p, v$ |+ [
if (record == 10 && i != (record.length - 1)) { //下一个数分情况
4 h! J, H, I/ F ^. U: i# e int[][] bsBak = new int[5][2];2 y; M3 M+ R3 } e" T k
cpy2deepArr(bs, bsBak);
, E A+ m/ } k* K1 j if (check(i + 1, scene, playerIndex, record)) {
% o& e: `1 y5 l, y2 S cpy2deepArr(bsBak, bs);7 C: z7 B) k1 } y7 S" r+ ~
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
; Q5 q4 }# ]% j% u1 F return false;
7 d. s2 @2 `: t2 w% L0 ] }
' r! O( M! s- m/ J8 B return numOfAbleJu < 2;- J) T1 H( Y+ g1 z# C2 \
} else {
7 G4 z, k% f8 m9 v$ F cpy2deepArr(bsBak, bs);* r; T" s E- R
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {; D+ [! k9 B) F h
return numOfAbleJu < 2;
: x% g7 {- |4 S8 n/ Z: n3 k. U& Q. F6 B- g }6 u. e" ~" w* _: o# d6 e. E2 h) o
}' C& p( a2 A8 q0 }
return false;
2 Q( W" E0 s: ~7 l8 n4 s J }
/ c0 P7 G: e0 G! C! d }
' Q3 ^$ H% a" i. Y4 [2 o9 g2 D 5 n& g% g8 H) `
if (!isWanZhengJu) {
; b: e. U# `: Z" e# K return false;; _! D; `3 b, K |
}& G) I# g0 q3 Q) g
// //检查是否符合五局三胜
) B/ y: `( D9 p& y; X* Z: c$ q# G// int a = 0, b = 0;& O1 S/ V0 \& K) k
// for (int i = 0; i < bs.length; i++) {/ C t- ]( J& p; |5 S) ]
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
1 F4 V% _0 j0 E2 q8 e" a; M// break;
( r/ C. t( |) \: B// }
. X7 Z1 P0 |9 R A$ P# a( `4 N// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制# d G7 i% W- m' C" \
// return false;
5 S: v1 \2 M( P3 v5 c# A// }
% q2 L& | N& y& _8 B/ |// if (bs[0] > bs[1]) {
6 L0 o2 L7 I; d/ M2 T// a++;
# ?4 ]- F0 L( y// } else {
: u( O4 H+ f$ C// b++;# q/ G C; T) H2 O% M8 L c: |; R
// }# n" h: V8 a; ^+ Z6 n9 p/ b
// }! {5 o4 v! }+ S$ u0 z0 N
// if (a < 3 && b < 3) {//没有一个人得三局,故错误2 ]4 P3 f9 N6 {8 H& L7 Y) [8 D
// return false;: a" G. L* U# L; E* ^7 ^ ]
// }8 `6 U" c; O! i( R
//只要有三局及以上正常结果,则可视为OK
! J: z. ?8 J; W7 ^; z: v/ B" _ int count = 0;
& D V, j& |& S2 w: Y+ U6 }3 @ for (int i = 0; i < bs.length; i++) {
* D& N/ ?, r$ X, a* i" ~ if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
7 i' Y. N z6 P8 |2 T break;
& t! L% i( W+ t( e7 t$ C }
% Q N O' p, w1 X6 X0 y$ | count++;
1 b4 y+ G1 A( k- D }# I" H/ W7 X' U$ L
if (count < 3) {* O, @( x% }3 o' r: s- H
return false;
/ z# V$ @# Z, z& c) l }3 \/ w% q0 e. i, f- f c$ x
8 Q! F, p+ {* J: N. y9 s
numOfAbleJu += 1;
( ?0 g v. v5 b' ~* K/ x return true;
: v0 u' k$ I% N' }# n& v }
& z; R! p7 v1 l* n5 H6 { private void cpy2deepArr(int[][] src, int[][] dest) {1 ?. P% c7 n. i, U" y4 {5 K/ ^
for (int i = 0; i < src.length; i++) {1 w/ d% p9 M e5 b
for (int j = 0; j < src.length; j++) {( a I! \8 v2 w% f! [0 w
dest[j] = src[j];8 E/ H+ d2 L& O: J9 x& W
}
6 T8 H* n) q" z4 H }
5 K6 t! `% o; I4 g. i }0 g( k" ~( d9 K) O' d
$ r+ y! a8 q# x- w I/ N; l public void printNowCheck() {* N a9 R+ n& t; e
for (int i = 0; i < bs.length; i++) {9 V1 N4 _3 a$ ?& k/ z9 O' c5 k! H
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了* R+ Y" v) X8 I
break;* K' x& p* @$ X7 D* R
}% K" C6 k; S6 A! `
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
5 k" ^$ ?2 F) f% z- k; b if (bs[0] > bs[1]) {
% Y& b$ J* y, O/ q$ v c& _ System.out.println(bs[0] + ":" + bs[1]);
8 b' T- e) j, ^" r4 F } else {; a! N( j8 y, W0 A2 N
System.out.println(bs[1] + ":" + bs[0]);7 ~+ r; P$ f& x; H' v
}3 I }! y$ a# w: T! c& S4 `
}3 ?; \4 P$ @% ?3 z1 J5 Y0 c
}
; k. F( Z# L: A/ a: S3 D7 P2 P3 J public void resetCheck() {: u& d; j* m2 ~' m
for (int i = 0; i < bs.length; i++) {
[" o# |6 o: Y* M& ^ bs[0] = 0;
. _5 T& z$ U" K bs[1] = 0;
% G9 z; m; f9 W& G. ]6 l2 J }1 s3 _, q# N9 N( J- k& s
}4 M8 N. ^, T3 }8 v8 v" Z
/**
1 L* I3 X( G& O+ _4 l$ `% @" o( | * @param args
. x; G* |" s; X9 N2 O */+ H0 Z1 h0 n, \2 d3 P( n5 K4 i n8 D
public static void main(String[] args) {
\" V# e ]1 d1 @( n // TODO Auto-generated method stub
1 Q0 [; j1 _2 _5 R) m) @ GouGouShiJiFen obj = new GouGouShiJiFen();
6 |" ?5 C7 c3 `# C7 Y int[][] testData = {) `( U( a9 }0 g5 P: V0 F3 E
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},0 _# P& T: A0 c4 ^
{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},1 k; ]! T2 ^2 R+ o4 O; W
{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}! |# V( ?- m! z9 O/ b6 Z
};
1 `7 Y* W. p F- J m6 V+ C for (int i = 0; i < testData.length; i++) {- `' U" {9 I9 C O. m+ z
if (obj.check(0, 0, 0, testData)) {+ I. ` L5 T, o4 D: O$ `2 O' Z
obj.printNowCheck();
6 ^! w. }5 e% \' M } else {
# D! G6 r2 J2 n System.out.println("Unknown");9 l2 m$ Y4 A! }$ D; i- |0 C
}
+ _9 ?& n; e, V5 s! Y obj.resetCheck();1 S+ `* g0 @& @, a7 ^8 Q
}: b4 g+ [* l/ B2 \6 c7 z4 V
}
1 {8 p7 w3 ]6 }" t- g3 a/ A9 Y6 ]
3 L0 M. p, q, _0 X- |} |