题目名称:蝈蝈式的记分
0 ]- O# j$ N& ^9 {
9 F8 r3 l, \/ }& v内容描述:
/ M* c& _# w1 X |% q/ ^
$ _8 E6 B) m( c; w& W6 _& l蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 & S. }* W' ?( u! N! n1 S6 W( ?
7 B" v5 C: G1 h: ]) h5 t4 N因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 / p/ M& s$ d: C& F
( r1 h# g+ `; U2 D' ^
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
# e3 A" Z- q4 ^! m
" I3 Z6 g$ c' M' n S输入数据:
* A8 }" F! `2 \7 q5 g, I
' x# }; I! z% _. N以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 ! s) f' V* E- J& o6 _7 q
6 \7 D: j/ c+ Q3 C! w
输出数据: - |' Z/ |1 N: x, u" K2 C+ F# g9 l
" }4 s0 d1 G: y( |9 E. F
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 ) Y+ X5 Z. w6 H* T5 e# n3 {. n
- D- v2 Y, G' [0 o输入和输出结果数据样例:
3 N b8 o8 l5 X& b" {0 G$ ^2 |7 q: b! K8 y% @# _, o+ _
输入样例
% p5 w, O% t4 }5 J# t' U1 f; e$ V$ |8 a8 O$ O/ N) d2 J
3 , r3 {- n* a6 h
+ h( l+ S! x# H4 {4 k* p
23
- d. Y8 T* p. P0 C# y, k4 X% l+ b/ L. e+ G+ w6 m4 C4 C) ?3 A# @
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 . B3 y' c; n* L4 P" R
8 I& X; D! Y% S
25 3 v2 j) H% E3 [: x+ N
- R% \' z6 A" ?* J7 S' F2 |
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 ' {; M: ^4 c$ Z8 y) ?
3 Y+ y4 [+ w! G0 ?' G) ^. c
43 - v5 s) y( U: q7 @* c8 z Y+ H
/ d! a" Q; @+ b% C. J1 F5 X7 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
! B+ q2 R! }& `0 A9 E! ~ 0 j( ^' n/ V: |, _
7 w. G6 ]* y- P {# F- @; Q" }, X
输出样例
" v6 B4 _& I: J( K$ o } ]
8 V6 u/ T1 w, ~7 F% \5 T! O21:17 ; J6 R" |) ~2 k3 R4 b7 C
$ G. c" A* R5 Y4 F# C
24:22 & p5 e8 [) j' D
/ E& X8 L' R& n. N: o: |21:3
( {; y! f( S. |; ~) ]1 ~
0 j ~' u7 w: v7 ?1 mUnknown
( S+ r3 e, o, r9 H
/ Y5 h- B2 Z/ K. [0 F! v. x21:14 : i" |5 Z L: r; [+ G
' W& E- }- N7 Q7 F1 H& `! q20:22
8 a1 y+ c' d9 M. i! N1 K- o* S- G: f b! x8 u
21:23 5 @* C% O N) [ J0 a* X/ Q
( _ b' |' l/ a' E& q8 V21:16
7 J3 Z: R- `7 F/ a+ @5 x2 |
; `4 s& @7 H2 |3 A7 h/ Y21:9 3 z' L5 l7 e6 N5 E3 A v
. v# J4 |: {' |. J$ w+ l# y {! P1 J
example: public class GouGouShiJiFen {
: Y% G- [ p2 o. `- ^. ^ u) M1 [2 F: R5 O7 u5 N, ^3 Y
public int[][] bs = new int[5][2];//当前可能的比赛结果
; K5 Y" o- G( ]// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
# @1 h0 Z X1 u' I e1 r, }$ M// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份9 n0 }( ?, w7 M2 d- T
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
F% z. }& \5 x9 D7 \) d public int numOfAbleJu = 0; //本行比赛可能的结果有几种
2 ?' I, B1 l' A- f H$ e
* _5 G6 [" L( P" T' I+ j /**, i5 w% A1 q0 q& v
* @param index 连续得失分的index; }% b2 _( Y! G" v4 d1 I' k ]8 C( L
* @param scene 第几局比赛. R, e) H" \9 E# }: y9 \. h/ Z7 H) U8 ~2 R
* @param whichPlayer index处分为哪个选手得分
5 H ?" }1 I3 e0 }( r5 j( ` * @param record GuoGuo记的一行分
& R1 V- C# s) ]4 d3 G: g * @return 是否是一种可能的比赛结果1 f3 q% n# l# m2 z
*/
, \* O* t" d( M; {% v public boolean check(int index, int scene, int whichPlayer, int[] record) {& E. h8 i# [' G& S" G: O: B @
int playerIndex = whichPlayer;/ k# N8 w: n. U# `# q4 p
boolean isWanZhengJu = false;
# X3 `6 f6 [( k for (int i = index; i < record.length; i++) {6 ?5 D& P. z5 l# V6 G! J/ L
isWanZhengJu = false;
" `9 M& I1 b( {* I$ N2 O/ _ playerIndex = (whichPlayer + i - index) % 2;. D; O4 y$ ?; |* U* Y
bs[scene][playerIndex] += record;
5 p; S, L3 A; L1 @' L: k* Y: O1 {2 L: z if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
. F' s3 P) ]& H if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
: l6 W: n) G) q" f+ ~# l scene++;
6 [: d! G; x, p& B5 d1 }! G' x whichPlayer = scene % 2;
5 K2 I" M; R" v! H index = i + 1;4 n+ q8 T/ h( \# F
isWanZhengJu = true;
1 `( G% K. L" o' `* D# T" E continue;
. H; [1 t$ r7 C! ~ } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
. `8 x0 i) J% X7 X$ w2 C4 ]2 x return false;
$ N J' E; Q$ e& e }' C/ h3 K( a. p8 N( x
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的3 j' _ ^/ e3 J+ f
return false; A& ]) T8 t3 m; J. Y
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束! C' R+ H ^% N5 b+ a3 E$ \' B
scene++;
' a* d% w& p& @ whichPlayer = scene % 2;0 m7 e( g+ s8 v5 z5 j+ N
index = i + 1;
, H2 z! Z% T5 p& F, e isWanZhengJu = true;
# x" `) N9 \# v continue;
9 B7 q+ c9 Y4 ]% A- c, t8 q }% y! x; i* O8 Z8 e& F; D3 x1 H
if (record == 10 && i != (record.length - 1)) { //下一个数分情况4 i4 j- w/ h2 \9 N w
int[][] bsBak = new int[5][2];* D( k+ K0 R) _
cpy2deepArr(bs, bsBak);
: L, {3 y! t8 m if (check(i + 1, scene, playerIndex, record)) {
% w8 [6 K& _+ o* b cpy2deepArr(bsBak, bs);/ u8 C; x, [. k" ?3 }- Z
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误$ A8 X3 R) D* E7 @% b" R1 Z
return false;: n2 G- j8 H0 G! ^# a
}7 x6 ~- M$ G5 k& s+ Z
return numOfAbleJu < 2;
* ^9 Q# F5 y8 W } else {
/ q; u- v0 f$ X( x% g, P cpy2deepArr(bsBak, bs);
7 i7 Z. a q1 V v1 M if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
$ S3 g" A0 F& K return numOfAbleJu < 2;$ @5 g6 I; b8 X; [! U
}& T* Q# m& K( k3 z+ R
}( B. J; {$ o7 S8 M- k/ ?2 z/ {9 @
return false;
, @) O8 A7 @1 t" d! Z }6 @2 F9 |! ?4 j' \! c& N2 w
}4 r q% L2 l- z# T$ U, P. E, A9 u
7 z( X$ h! w# f: K( U/ @3 w
if (!isWanZhengJu) {
+ Y r% }& l4 H. y( ] return false;
1 ?) w- b/ @7 Z0 }: H3 D9 x }
: x0 d) ^$ |5 m2 J* P) \// //检查是否符合五局三胜9 Q% r( j, Q* Q+ V. k
// int a = 0, b = 0;
$ O3 ^7 _" k/ \4 d" R7 Y// for (int i = 0; i < bs.length; i++) {* _: O) i/ u8 X2 C6 e
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了$ G! S" _9 O, o5 o* u' y
// break;7 a' Q7 ]+ \* [) ]3 }8 ?0 m
// }
7 Q/ [3 ~- z5 ]/ C// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
' @) O7 q, g( c* ^1 h// return false;
& w! P |. x) T1 ]" |6 u, \// }3 T9 y8 z9 [9 `" ^% v3 J
// if (bs[0] > bs[1]) {: u8 U7 }, d; [( ~
// a++;0 b+ V+ Z0 o" O1 o
// } else {$ ^, A# y' U0 z- X* K
// b++;4 d' p: J# ~6 f# N
// }) [5 { Q. Q3 R
// }' k% V0 C4 C- i7 r* @
// if (a < 3 && b < 3) {//没有一个人得三局,故错误
. B8 M1 Q+ k3 P8 \: K// return false;7 L9 |: u) y, ]& ^ s
// }9 L! y1 H' G$ X0 f1 i
//只要有三局及以上正常结果,则可视为OK% K2 E" `" Q* }
int count = 0;- U: }1 |" @. t/ o* ?6 d# [8 B. F
for (int i = 0; i < bs.length; i++) {0 Z/ N- t4 T$ w; h- `9 u
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
0 i: x9 o) B( c5 {, G break;
2 [1 l# m1 t% b" w; G+ v }! M0 ?- y/ Z K
count++;# {2 s; T9 ^9 C- n5 J' i
}
" g& M4 A$ \+ `6 W' F if (count < 3) {
/ c1 w7 t6 |/ w6 i9 O return false;/ O8 X0 p4 V2 u$ z
}. z- i! f: f9 J2 @* x1 X. i$ o
# M# M- J1 k. l( G3 c numOfAbleJu += 1;
) s |3 y, [# R, O3 N9 R: Q. Y return true;
" Y2 s& A5 G' f& h- s# Q }6 S0 q6 k* [! l5 {" R5 O
private void cpy2deepArr(int[][] src, int[][] dest) {9 n. F# A3 I8 ^9 ]# J) G! F# S
for (int i = 0; i < src.length; i++) {# B; F$ S2 v$ C
for (int j = 0; j < src.length; j++) {
0 L [. R; m4 U dest[j] = src[j];( U1 L8 a @2 W& b, V( z
}+ c8 ^$ ?+ l) {
}- t, M: G3 n1 H. J1 i: ?) e- }
}, Z+ f0 G) P; r4 s( s
/ w1 [% P* j2 |7 {1 y" a public void printNowCheck() {' W' S' v% k; T% A% r
for (int i = 0; i < bs.length; i++) {
: G3 h s" X6 W if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
3 p6 q% u1 r& c' O& G9 k break;3 w6 T2 |" q5 Y3 [) Y
}! B# l( M: k7 q( [9 E. a+ v( }
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出8 _2 Y# K N0 j6 @( H
if (bs[0] > bs[1]) {
4 ]& ~' C9 n% }! S, F o8 }( @. U System.out.println(bs[0] + ":" + bs[1]);
1 V9 N/ i/ H+ }- F' k } else {
, t2 ~5 C P& i) ?# E System.out.println(bs[1] + ":" + bs[0]);+ H4 C+ `' Y& [1 g
}5 B2 C& @/ U' q Y9 @1 d
}; W5 q. z+ D5 u$ [5 O5 s
}2 T$ }( s, M, V# l P
public void resetCheck() {
: @2 R% E; C6 X6 | for (int i = 0; i < bs.length; i++) {
0 Y5 f4 B' O& S' Y6 q" ^4 q bs[0] = 0;" w/ L6 y; l0 u h/ Y' |+ k+ q
bs[1] = 0;: z6 g/ u h0 l) q$ I
}
1 }2 J G) @ \/ I. W( d/ r, ~ }
0 q/ m8 r1 Z j/ `. }! A- o7 U /**3 z J1 D2 b4 Z, H
* @param args
+ Y8 X- \, Q: \0 ^ */
; O/ v9 q4 L; F/ d0 J0 k public static void main(String[] args) {
% Z9 I- Z2 M9 A6 Y' O // TODO Auto-generated method stub
' a6 N: S) I- t* n0 f2 Z7 Z, r! G4 R& _ GouGouShiJiFen obj = new GouGouShiJiFen(); M! l( B) d3 A) t' p$ y- }
int[][] testData = {
2 j! l O; Q/ X+ L2 X: k1 v {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},% s# ?/ y! n1 g$ [4 Q1 O" j9 V0 a
{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},
! E$ i9 ^7 E7 q t1 X" {# p' i& 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}' Y' W {9 T5 k0 j/ r6 C) N
};
0 b% z5 j: x& s$ x& a9 u for (int i = 0; i < testData.length; i++) {: z1 g0 K7 }* p; D+ u* i
if (obj.check(0, 0, 0, testData)) {
1 Q/ u" k# [2 I: n: e obj.printNowCheck();( x/ Y. e* q( X% j3 a( F2 N
} else {+ b2 m; ` H' c3 B/ \8 M
System.out.println("Unknown");
' e) F6 l# H& @! H' ^' B }
+ V+ R& s& c9 Q: R+ u obj.resetCheck();
2 l* A1 j0 q$ o; a }
6 T, R3 ~# k1 y- J }
( U* T! G" \6 ^, \* n6 H0 c4 D1 O l/ a( R$ Q3 u
} |