题目名称:蝈蝈式的记分 ) F N8 q# y* ]
9 f7 _1 j- }7 x内容描述: & c8 c) |$ H5 z7 K g' b C+ W" {
, x6 M3 ^' V6 z
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 # a2 l2 A" [. |( x
7 ?5 V+ o) T, B9 k; z9 P* u4 S& {8 K
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 & y- d0 q0 Y! ] l% y: U9 V7 [
9 K) E9 R+ q1 j. U8 d需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 ; }9 O9 L- w/ ?1 g3 K
# D5 h0 k) R8 C2 I: G输入数据:
" L+ _/ a1 m+ e/ D+ w- }" m2 [3 [# W4 R+ L; |* i) z
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
0 g& ~/ p; I/ U% [% M& s: M! X" c; S. n
输出数据: 7 k! D: U& ^8 i( H7 f
9 [) A* j& Q! R% Z% O. o
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
) O6 z. F. m" o* g4 g( [
- \) E! x$ \: `3 I4 V输入和输出结果数据样例: 4 f: j+ r% I/ ? H; k0 @
" f" q, W6 {1 |6 B
输入样例
+ B8 Z& {0 @5 |
7 a t9 m1 U, L) |3
) N$ Q/ s0 q* N+ `
. p& @1 }# V8 q7 z6 @23
: X* Q& N# ~- O u4 y) {- ~! i4 V' g7 W5 T
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 6 j* B6 g7 q# q3 \ J
# f9 g! O1 w7 U
25
: v% j4 X( F) Y
( u! B. w/ _# y+ `# Q) k7 B9 c; w7 M9 3 8 5 4 8 3 9 8 4 X X X X 2 X X X X 2 8 4 9 2 4
7 }8 w! Y) j& w2 x0 `. w) T* b0 _* j5 h9 G+ t- M- r- T
43 $ \. b2 }7 ^0 C* J5 u r8 ] f
5 w" c; z$ p {! A* s2 F7 R2 q7 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 " N; L6 @ v- R, B& ]: ?2 |8 H# C9 q& k" o
" r* u- v7 Z( k* [' L) R- ]- ?- [" D7 F
输出样例
# ^$ k& l. O, y, [
, W) `! S( {* _2 M9 I' d21:17 . u# ~% O9 Z" L* O- h% E) `3 S1 V
! J; g1 b& ]) E24:22 0 n( t- l8 M7 H6 A% x# x
" N9 n* s: F6 M2 \" }
21:3 1 J! c- I" b- \! q4 @
' M9 k: q2 _0 J) U: _( P$ cUnknown
! f$ ~% E+ x' X1 I D) c8 h" E
- n! Z* F1 T5 D21:14 " i/ I4 |% F9 H! }9 N& W4 U
- g+ l# M5 b# i6 h3 c! b) U% O# Y
20:22 1 L4 u/ }/ Z9 t& y4 R$ M
1 l1 ^0 `3 E, p
21:23 + ]+ j; A, _ a I- X/ w
+ i* y; `+ |* Z8 e5 h: W- l
21:16 , M+ C. l9 R0 U5 {) W% u; D
1 H8 M- j {( [. K- m1 b3 _: ~21:9 ! Q2 r- v( a4 @
$ w5 \8 ], e; v) ^4 A( D- F0 y3 p8 c7 i( K% y
example: public class GouGouShiJiFen {8 @5 i) ^* z) p; s% j
! J ] |6 g: o
public int[][] bs = new int[5][2];//当前可能的比赛结果
|. g' @+ b- m" {8 o0 Y% m// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果, V' i) L! g4 \2 I: N. B4 [8 b
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
7 _5 ]7 P- l6 q9 v( _; `6 t1 H& ~7 r// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
! m5 }1 u/ v; e* I S7 J `8 B public int numOfAbleJu = 0; //本行比赛可能的结果有几种
3 f' f, w& n, l" x/ y6 F
0 Y2 ]5 S- H% R- B /**' r* z( g1 i7 h) C+ { X% H3 b
* @param index 连续得失分的index
X5 \/ Z- j0 Y$ Y6 k9 g4 w * @param scene 第几局比赛8 R$ H y1 m, K# {3 z, d
* @param whichPlayer index处分为哪个选手得分. m6 X8 Q" ]# D# Y& v4 j
* @param record GuoGuo记的一行分' u' x$ E; j# r8 _( C
* @return 是否是一种可能的比赛结果+ E, n( j- [% w- E
*/
* m9 ~. I2 u* u$ T2 e: P5 W public boolean check(int index, int scene, int whichPlayer, int[] record) {
! g$ k% W* |0 o/ y: g int playerIndex = whichPlayer;
# ^7 t% f6 J+ i7 Z& ` boolean isWanZhengJu = false;
* t3 y4 Z8 I/ w* x1 O! G for (int i = index; i < record.length; i++) {
5 X8 U- L2 O4 u' s" m" O isWanZhengJu = false;$ H" L% C. m. h7 J
playerIndex = (whichPlayer + i - index) % 2;
9 j- }* ]/ }& \; C bs[scene][playerIndex] += record;& R1 u8 R: f( e; s
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局+ S' V, f f7 ~5 a
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束' c" d2 c x$ F3 [7 \* h" X9 f
scene++;# B; m( p2 k- V& f" S5 D
whichPlayer = scene % 2;: G% f1 _- O. E# a
index = i + 1;& p# V5 w1 H% D% y" d8 S
isWanZhengJu = true;
5 ~5 h$ Q h7 P2 d& _ continue;
# A/ x/ R) Q! j5 z } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
5 }9 o2 i* j% Y: U return false;
3 f/ ]/ q. K9 I8 ~ t }
/ n W2 g' a* g } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的* p5 n; ~) O! A% s3 A
return false;5 g. q+ V) U; b% W8 u
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束. k- v6 M' k* u: @
scene++;% p6 C' I6 }& F6 ]$ Z0 \( w
whichPlayer = scene % 2;- m* J8 ^2 J/ p7 [+ v# B
index = i + 1;
2 y: Q% d s7 F# _, ~ isWanZhengJu = true;
' B. S5 w- F; W; h* I* D continue;: d0 u8 k& @3 N# x9 s- I! O& I
}3 i- [' o, n: M, {( u ]
if (record == 10 && i != (record.length - 1)) { //下一个数分情况
2 S& P& n: D1 B" j' Q int[][] bsBak = new int[5][2];
9 a! Z& j/ n% f- s1 q cpy2deepArr(bs, bsBak);
$ i# H$ T/ ^0 \' N7 g if (check(i + 1, scene, playerIndex, record)) { ^4 d0 |8 X, u3 R
cpy2deepArr(bsBak, bs);8 Y1 R1 W; y( M/ _$ l/ [
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误9 T) a' A. k7 A, L7 G7 _% w2 U
return false;0 {5 G' l4 z6 l, D
}
2 I F0 t0 N' `, ?+ q, Q5 h return numOfAbleJu < 2;
6 U- l! J% W) O, v } else {
& f8 w0 Q) f; y, m cpy2deepArr(bsBak, bs);8 k$ B2 t. m. `1 H0 D f
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {) p$ N/ ^) H- k9 p: {& Y. @+ Z
return numOfAbleJu < 2;7 L8 \% P: D6 V _( c x0 }5 f# J
}9 [# q8 A, M( |8 _# I
}
$ F7 I, F0 M! N1 ] return false;: f0 |! J0 d" \) a2 w' ~& a
}% A, P+ h- G) Y. u( D
}8 j5 z, R8 P8 r
$ g6 l8 |3 w* \( z+ f I0 ^ if (!isWanZhengJu) { h& I& o+ Q: Q- |* x
return false;# g3 t. C: a3 i$ [
}1 m; \: y0 q8 |, ^: c2 d
// //检查是否符合五局三胜
4 ~" O9 c) M6 e- |$ z// int a = 0, b = 0;
" p8 p. ]% v9 _; K9 z0 q5 f// for (int i = 0; i < bs.length; i++) {9 _* X) t( J3 U c
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了% O) A: o; W4 |" y
// break;+ z2 _. }; h9 \3 Q( j( Y3 J
// }
( g _- a/ K: W) T3 y# C8 d// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制, G' d# U5 H6 V0 v2 Z u# ~9 j. M
// return false;
0 S$ i* j4 `; c4 q1 \// }; @5 M2 v) n* v; u1 z4 k
// if (bs[0] > bs[1]) {
, l# p) w8 m7 M- P; I; L// a++;# l- J% j( C( Q
// } else {/ l8 t% Y: a k/ k$ i' a
// b++;# U! t' @/ _& f- I
// }% a2 }/ w- Z4 G, m* |- y/ G
// }* N, ]" G3 i& ~/ V
// if (a < 3 && b < 3) {//没有一个人得三局,故错误% L" Y: o) k# W$ \
// return false;
$ t" K' J/ {. a. R" }% K4 }3 A// }
" ]7 F9 h- v$ K6 z, g4 W! q: u& D //只要有三局及以上正常结果,则可视为OK5 J* ^: o, _2 B+ e) e5 M f
int count = 0;2 \8 }+ U+ G$ c( b' _. p0 {
for (int i = 0; i < bs.length; i++) {
5 i. E Q' E7 G! g! v if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了) h& P V! Z5 Y* D
break;' c! z1 l0 E' v+ z! _& X
}8 a; S( V, U5 _: [
count++;
+ T, Y+ ?7 u& h8 A; `* E5 t }
) c6 C2 t( y2 B8 j if (count < 3) {
! j/ y+ D' |9 \' q k% m# I/ Q return false;) @9 S. ~+ j9 Y* V1 a+ z# ]
}5 b: P: ^- g8 z) A, z
% ~# k1 E; `2 ?7 m V
numOfAbleJu += 1;
* O, ~1 h! x& i% p return true;$ X1 Q. |; O0 X
}' B+ g) x$ N6 q, d ]7 k
private void cpy2deepArr(int[][] src, int[][] dest) {0 f2 O0 `- g: D+ h5 p/ s- V7 d
for (int i = 0; i < src.length; i++) {
! U. R3 \ [* ^' f3 H0 C for (int j = 0; j < src.length; j++) {
- g) {6 m, f. H% w' c# f dest[j] = src[j];* D7 E7 c6 T9 ?+ Y
}
/ y" x. f/ E- U- j% ] }- e$ m, Q( `7 a/ I
}4 Q2 K$ W5 |8 ]' Z
V: I z9 T& {+ H4 l4 h
public void printNowCheck() {
& O' ], [5 i+ C0 W, n u2 a for (int i = 0; i < bs.length; i++) {3 p* ~# ^* Y( O# v. t0 y
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了/ G8 C4 H. ?( o. U7 G
break;
: l4 T2 B" x, `, D$ G( | }
$ G& m; c5 g3 b //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
! R8 I1 u1 a2 c3 O3 z if (bs[0] > bs[1]) {
( X. e6 H! V8 P* N. A( c4 P1 U System.out.println(bs[0] + ":" + bs[1]);
0 M) f1 @3 _& X# _1 A3 ~6 a/ ? } else {: c6 e* i& v9 D1 A$ Y. y
System.out.println(bs[1] + ":" + bs[0]);
- c( ]- E: X. a& { }. h. D! O& e+ |5 E; |
}
) ?& A( l6 q/ t5 ] }
# I9 w6 X$ `# O! d. ?0 w+ M r public void resetCheck() {! A" x5 N7 K3 q( x- n3 P
for (int i = 0; i < bs.length; i++) {9 K: y0 T6 S1 `" `& Q+ F
bs[0] = 0;
1 d( {; G+ Q: `5 U bs[1] = 0; {. w }8 p2 \2 _) x1 n* l
}
$ d5 j; s. s3 K }. r1 o8 ^" R1 z
/**
; I- ` o# k4 Z" Q3 | * @param args- [6 F# c0 v! U' S
*/
' ]- W& v+ a# A7 c5 m2 |" ] public static void main(String[] args) {
0 f* }. @5 l y& p) J- g8 J- B // TODO Auto-generated method stub/ X1 @! Q. c" d9 z% x2 \
GouGouShiJiFen obj = new GouGouShiJiFen();
: o" F# n1 g8 v' Q" Y6 U int[][] testData = {
( e# M. S3 Y) g3 D$ L) |, h {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},/ w z2 V1 ~. w* P& A7 D R
{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},
) [0 I) z+ w0 s( q {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 Q/ V7 E, o3 z4 g" O/ W+ C };
7 c4 r6 u$ x: d5 L: S) b8 y u for (int i = 0; i < testData.length; i++) {# ^7 i; @' p0 X: x; u5 q
if (obj.check(0, 0, 0, testData)) {. H" I/ U" F% r" }! Q8 C2 D
obj.printNowCheck();
/ U4 Y/ N$ p6 [ A } else {
3 v5 O8 {+ p1 R$ e9 q System.out.println("Unknown");
, Q+ K# V. m' U( z: d }
# x. J P, X1 D obj.resetCheck();
% P, G, e8 y% D) a }
" ^0 E t3 Q3 A% R! g. X }
) c. Z0 V. J: F+ e2 x
& l+ G* G4 s$ F' I3 J' R} |