题目名称:蝈蝈式的记分
* B+ n$ |, C* O, O' l$ e* c8 a( d" g ~! ~" W+ \* @7 H
内容描述:
8 f0 I O( i+ I. {1 s- q8 t
9 w- U& u1 r# g: E$ p( L0 U蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
- |! w4 r& ?+ G- f
! ~4 t( E! S z9 T* W, S4 g2 M因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 3 w; Y. }7 { l$ E! Y8 P4 n6 v
7 P3 [+ W8 o6 w7 W3 @& e6 f& u/ I
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
v- U; P5 ]: h4 ~' g9 {! x3 M* q/ a! D- v: d, j/ T
输入数据:
& D0 }3 T3 Y5 M# P9 S; W; }3 n" Z4 H* \4 {: m
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 ' j' B# r. Q5 F- D" `/ [* L2 @
* N6 V( T& r4 e
输出数据: 2 N6 w+ j9 L3 K, P4 Z# y
8 d% [* l! H- K; [) w相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
! ^% B4 g( d Z, K6 ~/ x i, \0 s
输入和输出结果数据样例: : {+ h' h: l& m1 x8 l# u4 y
9 I- ]2 g: _) Y, J
输入样例
* W3 V0 x# ^1 z# |8 a% I. G, V8 [7 T5 u" p. [" P, s- |7 ]
3 # U) H0 A' g1 q: T$ s6 O
& S2 T4 V# X7 F
23 & e! G) O. T% e) d4 J3 m( N+ v% ~& r
5 W$ _* Y% f {9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 Y$ y9 k. P. @9 ^4 D
3 H; F7 ?* [6 U25
* Q! R% U$ T T+ V, y' k; \8 }- V! K1 L, |1 ?; z) s, F0 v/ g
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
' U4 c2 v) v# L5 P7 l- Q
* p: R( o6 n' {6 ]3 l7 ?% P43 ' Q8 x5 Y" f4 `! [- d2 T" d+ |
- g& D/ | N V0 c, @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
$ U, O" k6 U0 a8 v2 o; c8 r
( w0 e, H! s4 c s* R+ P1 p4 y
输出样例
- D. f0 j* }( h: P
- Y( h, \$ { {/ \: e21:17 0 s! T, O, `9 z, v% d. |
( L( w/ q6 q& w* r2 i- P4 r
24:22 * P. D& H% R9 I; N+ B: `
, k# {) m3 E" c8 n/ S' r. d3 ~
21:3
9 R" K6 \: u9 W, C& S2 q1 G6 L! k# v4 d6 M1 o& @
Unknown ! U( J0 B+ B9 o- g% u7 r
* n: k; G3 Q' t8 L4 T4 t/ C8 u
21:14
; f5 n5 A9 k; r( t0 g
' a A l" X1 q/ R) |5 ]- D( N20:22
/ L+ q& \, j( c9 e. l
# q) }1 B9 Z8 Y, e21:23 6 `" j8 }* `5 \/ w# N: B9 Q" @
: t) c- e8 M7 S5 h0 {1 B; b21:16
! u" M# h2 F' u% ` K4 a
8 `; e$ ?1 |5 r; {& \2 R" ~( ]/ k21:9
h( v$ A$ x3 {( ]5 ~9 y' Y9 m
( ?; `' j- _) d+ o! E9 ~8 m7 k% h6 i! _( W5 F ]
example: public class GouGouShiJiFen {
; a6 K( P2 l4 F- E+ ]& d, H' ^' |: J& N, Q/ ~
public int[][] bs = new int[5][2];//当前可能的比赛结果
+ X4 |4 S% P* z( o5 n* k( {// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
# w+ v6 u0 d p9 _( X M// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份/ \6 i; O5 o/ W# T( I
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
8 n: X# l# ?) m3 ?7 ~# M9 j public int numOfAbleJu = 0; //本行比赛可能的结果有几种- \4 i: v* G; L- V1 o/ {/ S
9 c9 u: T ]1 K+ m/ H; ^( ]
/**. W+ H0 t+ _! k) [ D; G
* @param index 连续得失分的index
: l5 r: b! F. b8 D& Z! Y * @param scene 第几局比赛* L) R: p( W. N( p* i
* @param whichPlayer index处分为哪个选手得分
0 C( U2 [" a8 ]# T * @param record GuoGuo记的一行分
& X7 ^. a1 k2 f, n* i * @return 是否是一种可能的比赛结果
% d; e2 R9 _: M( u2 Y1 i0 l3 E */4 y0 V! B6 ~, B0 u; W$ W
public boolean check(int index, int scene, int whichPlayer, int[] record) {
9 p: X$ ^9 a$ G! [ int playerIndex = whichPlayer;# K$ O" w1 Y6 |: {
boolean isWanZhengJu = false;8 J3 R2 P2 ]* X2 `) ?: V z
for (int i = index; i < record.length; i++) {
5 Z0 k' v% D) s; l6 K isWanZhengJu = false;! z4 M- o1 k2 ~4 l5 o
playerIndex = (whichPlayer + i - index) % 2;; ?; A: r8 x. b" S% N% ^; A5 }
bs[scene][playerIndex] += record;
! p8 [& J5 t6 h! b. T3 s$ J- l' n5 |7 ] if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
! A2 E7 X! {, e; Y: T! a2 W0 |6 O: a- W if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束' p- C5 |- ^: {# r# f& d8 V
scene++;1 _- D) ?* g5 I5 h- O0 v8 n
whichPlayer = scene % 2;, R4 |* k4 @- M# ?
index = i + 1;. ~( X6 s# k Y {5 S& ^
isWanZhengJu = true;% {0 ?) A4 v: K
continue;
% [* H6 B; W ]; M } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
; v4 A/ \& C9 ]" n, T* M9 f; n return false;- C) L2 f4 H" x, V7 S
}2 |6 n) |* w8 u. I7 W, @1 N8 P7 T! g3 U
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
2 K7 I% P* W8 W* @ return false; i( a$ \# ^$ J% c; M9 L
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束; N' e: b) z" j9 r& q7 N! X' S
scene++;5 P. @4 m* H2 A( R& T
whichPlayer = scene % 2; J* O( f5 W3 @5 X7 F
index = i + 1;1 q6 `& T% `& g
isWanZhengJu = true;
, s( @5 X( b2 F continue;7 w5 s9 q" d* F5 N
}
; N- Q' z0 p! _0 K8 m if (record == 10 && i != (record.length - 1)) { //下一个数分情况. W+ u# }) G2 l; \( u
int[][] bsBak = new int[5][2];
2 @. G7 I- v6 d4 ^$ p cpy2deepArr(bs, bsBak);/ U( Q! P7 S: | v' E
if (check(i + 1, scene, playerIndex, record)) {3 s7 z; t- T/ h* T
cpy2deepArr(bsBak, bs);$ B6 x+ a U. i6 D
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
, U- z& k8 L. t7 `$ O* h" r- o+ { return false;
; M$ i5 p2 x3 ?* R, @ }
3 P1 r4 e! L7 L6 v return numOfAbleJu < 2;1 Y+ I& N7 f- w% E1 _# z( {9 s4 T7 {
} else {$ I: ^, h; ~- }( ?0 h) |. ~0 w. d
cpy2deepArr(bsBak, bs);$ ~! o: I, m6 x( y- h/ p
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
! r3 d* [% ~! T9 L4 \; Q return numOfAbleJu < 2;
3 g6 i( I W; S& O% L }% E3 t" h: I: ]0 N/ N+ P
}/ Y4 T( ], Q4 y" T/ v& a
return false;
* _* c4 k0 S' f9 T# U1 p }; Q8 s/ O7 Z) g& ?2 [- k( o
}" u& T, x2 G1 h3 o% t6 x) c
8 d0 O7 K$ {. R! K2 a \" t$ U* @ if (!isWanZhengJu) {5 O" ^$ L6 e' F) w
return false;+ z a4 L( B& B8 C$ |5 y
}
3 U8 J4 T# c- l/ |// //检查是否符合五局三胜
! R, v8 f& l3 [( w// int a = 0, b = 0;
2 A) \0 e. x0 i# G9 i, s// for (int i = 0; i < bs.length; i++) {7 G* `4 j) |* W8 ?3 m" }& D9 |/ }
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
; F3 J* W' g2 M/ A4 ]// break;
$ x1 E2 [- L( T k4 t( }// }9 Q" m# ~- h& X% l
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制+ j' u# u6 ^0 k
// return false;8 i2 k' X; h5 }6 o) g3 ^
// }; a2 R+ `2 ]; `3 Z6 K$ _+ ^* w, f
// if (bs[0] > bs[1]) {% [* F+ ~" u6 b7 S
// a++;
* N# \" c: p* i% B// } else {
( u5 j2 @: s, _2 O9 g, V// b++;
& c6 f- Y/ h+ `9 ]2 T// }
) `# o0 r) w% T6 q$ b// }& D, F E6 G. A
// if (a < 3 && b < 3) {//没有一个人得三局,故错误
4 G) n& J, d6 D( E2 o// return false;
( J+ D6 ~$ C( H2 A4 M// }
2 K. @9 n9 z v+ w! l3 e' { //只要有三局及以上正常结果,则可视为OK
' ^8 H2 b, @0 v. M( }* \: V3 V9 p7 o int count = 0;+ P7 c. N$ j' t9 D! p" o6 `3 m0 H
for (int i = 0; i < bs.length; i++) {% G6 J/ c, ~- n2 ^/ _! E; E4 k
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了5 \* j) g# Q7 Y$ h6 c" h* q+ C
break;$ L- n' h; L: G6 d
}
# J2 N! v" H( h3 C3 x# J count++;
$ e H6 }1 M' b Q* I }7 w# h) Y+ }; M; y8 a" i0 Q4 z
if (count < 3) {
1 O# s4 C. ]7 T9 ~: b return false;' ]4 u: l3 t, B0 e) Y
}
. A- F- Z# D+ g9 `+ `4 o0 ?, z 7 h: n) V$ [; o9 X ~: W3 S+ W
numOfAbleJu += 1;
/ M; p2 [9 W: |8 H return true;
* f8 V3 C C( l1 D2 P) K) } n+ A }) Z1 ]) |3 w. U7 ~2 {2 A
private void cpy2deepArr(int[][] src, int[][] dest) {
/ R6 [8 ?5 a& }0 F" t4 Y, S9 R for (int i = 0; i < src.length; i++) {+ t7 Y6 H9 d! y
for (int j = 0; j < src.length; j++) {
* ]' m5 B: J7 Y2 T: i' \2 w dest[j] = src[j];$ x0 z3 O k9 H% i# Q
}; {8 k5 V; [ M
}5 a5 Q2 i$ X* o: _1 r
}
; ` B: {8 L0 h/ M: z% Q / K! c$ E5 P+ q' G9 K
public void printNowCheck() {: h" P- I+ b8 k
for (int i = 0; i < bs.length; i++) {
: a9 k6 B0 @- k( @" Y- f, [3 l" w if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了) M: c$ A) S% H2 ?" s
break;
4 m( n+ y% B4 G3 X$ R }8 M# \) p7 L) o0 Q5 @
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出* j o9 s; j$ g6 o! q+ r/ I
if (bs[0] > bs[1]) {
, s8 q ]9 T0 G0 S System.out.println(bs[0] + ":" + bs[1]);# l" C% L2 Y; f ~! x
} else {) Z3 w+ k0 ?* Z# T: ?' e
System.out.println(bs[1] + ":" + bs[0]);, l- h0 O5 L; u" D# B% h. v& _
}
5 {# H2 j* `1 o' R8 Q. a! J2 l! x }" l1 c8 |4 W* L0 |+ {% S
}; H5 p' `: z/ K7 K
public void resetCheck() {9 U$ t" Q/ O, T! _
for (int i = 0; i < bs.length; i++) {: q( _: ]' d+ t, N! ]! {6 s' V) B
bs[0] = 0;# R2 [! k6 }& h) h
bs[1] = 0;
! n# i% `( N+ O }
) j4 V- o8 w8 ?% n; t }$ Z% B% z7 R; X0 j
/**
+ Y: U* J' K& e4 m7 a0 \ [ * @param args+ }& Y2 r" E X
*/
0 h6 @) a! d4 ~$ w7 ~ public static void main(String[] args) {
% p3 c) R* l0 _& @ // TODO Auto-generated method stub' _$ S6 y8 D& C3 D7 K
GouGouShiJiFen obj = new GouGouShiJiFen();2 i+ z T; g6 e: B- l3 p
int[][] testData = {
6 U, }4 z$ O/ v \* e. r {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
- g: }5 k) v" T; T+ m# y {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},
! R4 r! g( x0 h$ x {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}
0 R; X2 F' T F };, N y# r: s# f' Q5 t* }' e5 F$ E0 H. J
for (int i = 0; i < testData.length; i++) {
. j2 N6 B) {1 u if (obj.check(0, 0, 0, testData)) {
t' N+ R% q+ `( M9 C4 i obj.printNowCheck();% C" x ~4 |0 f" F4 o
} else {, |1 B- j1 V/ K: Z
System.out.println("Unknown");& f- a+ T& a2 a( K) d% u* j: y8 {
}/ A2 ~+ b6 P- Z$ M, `
obj.resetCheck();
# P' o7 L' |* L }
, J; _: o; P% g2 }. d/ h( C1 O }
3 m. l$ \/ T* E% g% C. W( ^2 H, h! h2 e0 w5 x4 ?/ U
} |