题目名称:蝈蝈式的记分
6 z4 c2 I$ b6 @+ X
9 E5 U9 o4 E7 W: i, p ]3 p内容描述: ( O9 ?6 | u3 R+ J7 N9 o$ k
3 }/ \& L. y. `7 X- f; j! m0 ~蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 " y: r% o$ [6 h6 ?/ O9 @6 A
& R; f/ }1 I- I/ e4 z; i% R1 N, W因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
2 e! R" ^$ C9 k6 z0 _) d. p3 S; K7 u7 ?
% K( M6 f; l `/ Y: W% _: F需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 4 x. N2 s( W# c! y* A }
+ y8 d1 o7 u1 t ?3 A3 M6 W输入数据: + F* m$ T- t% Y0 t- L
) i, L# V8 F% o2 v2 U0 Z- p以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
0 w& W0 u; ~6 ~5 V4 K
9 p& E+ S: C9 w& }3 q6 g输出数据:
6 p0 w& z9 d" W' q) ^
( x5 v& x) W1 O5 ]2 P相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 6 d1 N$ i. D# x. k& h
( t( X) P. q/ I J6 Q
输入和输出结果数据样例:
0 r% j; c. b2 x+ B; z, b5 o- ?0 V2 z4 Z1 a+ \; t0 ?
输入样例
) C2 B9 k6 X# Y7 J
) R7 i7 n9 F' Q8 f5 H3
s+ x1 z! t/ R3 W I/ P3 z
r1 L+ \% f _6 U! n23
7 \6 C; u Y! J% h+ J2 x6 X/ K/ I# J6 D2 A H0 \
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 4 q. X# n5 D3 G5 o+ M: q6 E3 T
8 ]% P" d+ O$ U0 d) M2 B4 |+ |' n25 $ A; _6 B& k0 u5 n2 L
3 F4 u$ d! e" x6 ~- {
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 & U' r, J6 r: w! H1 h! }
, h* G- o2 N% r1 n1 u4 m* h43
, L' ?0 t8 {" u+ m2 H
! @" W" G8 i; z) c$ c1 j# ]- d5 e7 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. D$ w& | O8 g2 u
: ~2 @8 J# |, E: S1 _
# v/ z6 l: v7 @* q
输出样例 G1 G7 P; @0 D* K3 M7 c
+ i1 C! b) A: E! ^3 u, G
21:17
0 `4 `% D x6 l2 L" R# y& g- [6 O: A' \1 S4 o" a
24:22
! q. c. n/ D8 x7 w3 Z5 @& z/ {' V5 |1 ^6 z/ B* \# g
21:3 % \' z/ m! A m+ B% m
! s. E& n6 g: G2 [
Unknown 3 M! o7 Q9 \* ?4 ~8 `7 V" [
" I) m1 p \" A# A/ I21:14 ; N' d+ Z! B* Q+ l( K
7 X6 W i/ M4 l) B, N. d7 h20:22 ; `% U) r+ G; z1 D& r- g
% N( P+ T' N- R5 [7 {7 n3 Z21:23
# c% z8 v+ W! f8 h6 s" {0 y! a9 u) R3 G, O) V- k& V/ [; H
21:16 % E1 g3 \( \0 z" h+ o! z. W
) `; y7 z2 a2 d; W) f2 }$ F
21:9
% l; u; U" H4 @ |0 P/ Z
4 y4 `, ~: G( i) ?
4 Z0 _/ u0 r5 @9 x% x/ Pexample: public class GouGouShiJiFen {" i" b& ~3 c' _" N' P, Q" d
0 r( Q) G. }$ a0 t( C3 U public int[][] bs = new int[5][2];//当前可能的比赛结果
0 k. b+ j! \8 Z5 z6 s5 O& f, r- a/ M// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
/ _" F2 K3 J" Q: V& v// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份$ J* n0 N& s7 a2 D" a' a2 t+ c3 ~: @
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown! y: v8 _* N H
public int numOfAbleJu = 0; //本行比赛可能的结果有几种
% U" v/ q' X9 S4 H1 n1 a1 N0 [
4 p2 @: `6 T8 }+ s% s! n /**
( F! C& M$ B' l. B" i * @param index 连续得失分的index7 y3 E, |( p: G6 x5 H- T
* @param scene 第几局比赛% ~8 {/ C a0 _7 G3 B
* @param whichPlayer index处分为哪个选手得分
\& B& w" ~& v6 V1 y( g- m6 X& w6 d * @param record GuoGuo记的一行分
% Y$ K1 ?0 r9 G& i3 r* a * @return 是否是一种可能的比赛结果* u4 G: g H( w. C3 j# P j
*/
5 g. A2 z" n, j2 _ s! ^ public boolean check(int index, int scene, int whichPlayer, int[] record) {
0 z; R3 m+ U7 s: W6 Y int playerIndex = whichPlayer;
* u" x) M: O a/ ^$ p. n q1 e boolean isWanZhengJu = false;
- v; ^' V' U4 x, p. R for (int i = index; i < record.length; i++) {1 V/ d6 e0 ^% _; y3 f% ~1 @
isWanZhengJu = false;
$ e" ~$ B r' n! q& G6 N) ]8 R playerIndex = (whichPlayer + i - index) % 2;
" N7 B$ k4 i( }* V; N bs[scene][playerIndex] += record;
b" e: c# A9 I0 ^4 A% ^ if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局1 f1 v. Y2 m* A) i, F- ~8 |
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
8 z& R% _) D; n4 C6 z6 L5 h0 y; A scene++;; m5 m- v, o3 O0 z- Q9 h& f% I8 {
whichPlayer = scene % 2;1 X9 a# ^( ~% A
index = i + 1;
3 L" V" I8 \' C2 ~! v! { w isWanZhengJu = true;) s: I1 u, I' D; n2 N- T; K% V
continue;" W( C% U0 k& Q) Z) f, e; Z7 R/ U
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的' _& [$ p4 Q" \5 M7 ^' Z& w& L
return false;
7 L2 k; w9 x3 m& d" q$ h5 i. f }
9 @$ b F9 H7 ~7 h0 V0 m5 S& } } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
9 k5 W7 k4 U% k. [* x# X! K return false;
1 g! [' o$ `9 A0 m0 D } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束0 Y* M9 |$ U6 g5 f. C! [1 a
scene++;# h- d. ], `/ o: X, v: \
whichPlayer = scene % 2;. B; W5 G! D1 @0 x. R! t
index = i + 1;+ }7 ^: _1 @, q6 {9 B
isWanZhengJu = true;8 t' e# O- d) n6 p
continue;
8 B6 ?6 F6 O4 r! t0 T6 N }
9 C0 T* X9 P; s, n* | if (record == 10 && i != (record.length - 1)) { //下一个数分情况- v P; Z/ Y- e& ~* t" ]
int[][] bsBak = new int[5][2];
0 j9 E! X+ n0 `4 j: Q* m. w cpy2deepArr(bs, bsBak);# D6 N! g3 J( J* o8 }1 d6 m
if (check(i + 1, scene, playerIndex, record)) {
) D+ m, j& q/ w( h cpy2deepArr(bsBak, bs);3 H* P9 A: F5 L, h
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
8 p& ?5 R _/ ~0 L0 m return false;
- u! b) v0 R/ k }4 G1 c, u- y" G: ?3 M% F# b9 a3 o
return numOfAbleJu < 2;) C- r$ C. W+ k4 P* q# `
} else {$ w( N: J2 f, y7 Q4 j
cpy2deepArr(bsBak, bs);1 G4 p) D) {" b s
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {9 |. F0 Y: t. V( S
return numOfAbleJu < 2;
, \2 v7 s' |# E4 J1 z }) T; V. K1 E& o7 k) G1 z6 T4 p
}4 E1 K& R3 R4 G
return false;
0 E; \+ U0 f7 i; ^6 ~0 R3 [' m }
9 a( {* Q8 v2 Z5 c- ?" o }
G5 e+ J/ ~9 X& S5 _# t - q3 S' R# c" {+ ]1 |& [1 E2 @
if (!isWanZhengJu) {: ]- k" o! k- ]# e' H
return false;
3 j8 F, H+ X. d( F }( b5 H6 o( N& O$ D5 Y% M% o
// //检查是否符合五局三胜$ f$ G% X# c1 t& k
// int a = 0, b = 0;
1 z/ e) h( x0 i- I9 o- a8 Y7 x// for (int i = 0; i < bs.length; i++) {( Z1 ]8 A6 t- u1 s6 @
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
2 v. p5 e% U1 O7 y; y* Z' L// break;% u5 m! T+ K. O8 E
// }) |+ i. H: c. c( d; x
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
, d" S- V1 l; z, h" M// return false;
# K/ a/ h5 L J// }+ U! k8 H3 ~' ~/ ~4 }- V
// if (bs[0] > bs[1]) {
' ?+ T. U. M& P( {+ e& b// a++;6 H& R! a8 m5 \, I9 y6 Z
// } else {9 @+ x; M0 _5 s# |. c
// b++;* c+ |" L. \ B0 ^
// }
' U, ^% v& _* N# k) [// } o) N) Y8 p& C, g4 m- S: T
// if (a < 3 && b < 3) {//没有一个人得三局,故错误
* O- Z, Y1 e0 ?( a! N// return false;1 P" u$ W$ c# m9 }9 }/ }+ U& ]
// }
+ ` e& k* D# \4 N2 {+ C& G //只要有三局及以上正常结果,则可视为OK$ p w' T3 z$ h( c6 z' s
int count = 0;
* f: ?) o2 r e+ F4 D for (int i = 0; i < bs.length; i++) {2 Q$ T$ r; \7 \: R2 N& D( J& Q
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
' `9 l- P5 y" q* Z. b break;, h ^7 {' I# k4 s
}
* \* f8 q: w) d4 z" {: j7 E0 q count++;( C* x# ], I3 {/ o! U( s! e
}5 U( H, l& E& [, _/ M1 a6 ~
if (count < 3) {+ F4 s% Q6 a9 M# E d
return false;- @) |" ?6 b# C8 |
}
/ Q+ s' x6 `9 H5 t+ \7 a( d' M& U5 P) y 2 \- i, u3 B9 m2 t; o" t
numOfAbleJu += 1;
! D/ b4 K1 n. g' p3 z return true;
. @2 e/ l- t! [# @; _8 I0 ~) U }
' ~: {4 K; l+ z `0 p- G private void cpy2deepArr(int[][] src, int[][] dest) {& E" J$ c5 L9 N; D& Z- R, h
for (int i = 0; i < src.length; i++) {4 B$ P6 v4 X' [
for (int j = 0; j < src.length; j++) {; c1 r" ]* T+ h3 ~& d" ]- n
dest[j] = src[j];- T/ b. j1 k' {
}7 m e N: U% h& c7 @9 |) Q% o" [2 V& v
}
# O2 V. `4 T; |1 W9 g7 b }) ]# Q/ L. M6 r: w+ J& d" G
3 q2 g7 F9 q4 P& g" G: y/ H: ]
public void printNowCheck() {
" u" X7 z! R& E# Y" B3 T0 C3 P for (int i = 0; i < bs.length; i++) {, O, J, G! j: W7 }) r2 I, z
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了 `2 O7 ^! `: D. {
break;) K7 L) W# X, U! B1 m8 I
}
Z" u7 d1 f- c8 I //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
& u" y; \ G" b0 J" `* _ if (bs[0] > bs[1]) {8 w4 n9 f5 T5 j# e
System.out.println(bs[0] + ":" + bs[1]);
! x$ W& [0 j; a$ Z1 X } else {
3 `/ y4 ]9 ]4 e; a System.out.println(bs[1] + ":" + bs[0]);
, U6 ?1 c7 C: i6 `6 q! d, k }# ] T7 k3 c3 l# p5 R& F
}
1 |1 y. ^# L( | }
0 _% @: X" G1 Y; A: ]1 p# j& M- R public void resetCheck() {5 s- B2 E4 w) @- Z2 h4 s
for (int i = 0; i < bs.length; i++) {4 s5 R+ L- ]5 A$ H1 M
bs[0] = 0;. c: ]8 U, q! f7 F3 w9 A7 `& J
bs[1] = 0;
0 m4 y+ X& T, A2 o }, A% E, ~, O. o- F* v; t) m
}
$ u6 J3 y: `5 X6 L/ g' E /**) L6 u$ g1 G0 p: ^' T
* @param args
1 Y' g$ j4 p( M */
8 f1 }- s4 J1 z" F$ v( o& g public static void main(String[] args) {
% ^0 d! m: V! N ?2 G0 H // TODO Auto-generated method stub
+ P8 l9 I4 Q4 i7 i: H8 j2 U# L* h GouGouShiJiFen obj = new GouGouShiJiFen();
! @9 k# ^, Y+ S T int[][] testData = {
" A$ g$ @8 z9 r% Y/ `9 x1 W {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
8 D" c0 I' b! F" }4 [% [3 z {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},
9 t8 c) y& h) T- E {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}$ r- ~% O7 v" ` z3 h5 w
};
9 m) y* z9 F5 d8 e for (int i = 0; i < testData.length; i++) {
7 g0 t- R% w3 g7 d6 D4 B7 F+ g: V1 } if (obj.check(0, 0, 0, testData)) {
2 E* V/ l% \/ b+ K6 M obj.printNowCheck();
+ F1 [' Y% d/ m$ Y- T } else {7 u+ q, u$ t& i+ E
System.out.println("Unknown");& Q8 _. m. ]& {! h U6 r
}( u- u; M6 n* l6 R* w' x$ U* R
obj.resetCheck();8 l0 f( A4 I: `$ k3 s! S" U
}$ D- v3 P' K: S; A- S- j. d7 p
}
5 _- f; [# W) t8 H
2 R7 V* }1 K( t) ^9 N" G} |