题目名称:蝈蝈式的记分 ) d( R- Y, e$ P7 t0 O* i1 G* T
. I! Q' b" o/ O- t- Y( a* N/ O
内容描述: 6 B" f1 B1 A! m% Y1 S
$ C. @, L2 R' A2 L, I2 B
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
" F& J" E" b9 d& f/ x h% H8 F6 v5 ]' R" C
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 ' S# j' {$ ?. |: L$ ]! E8 B2 ~
0 g5 N ~2 v% I5 \
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
, }2 [4 V9 V3 H& J* S& d3 O) R" U9 Z/ {4 `7 Y/ ?0 ]
输入数据: q) ^/ p; e8 Y" b8 v* i% B
: p# Q6 ]! L; F# B+ A' h以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 0 T- }" e; m' D
5 ?6 [" h$ q0 V# a/ f
输出数据:
* x, u- K: R' y% d/ Q% z- u9 C9 Z, a! {% _$ G4 c, _
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 / X$ Q2 A! s6 [
$ M* |" h$ Z) g7 d/ r
输入和输出结果数据样例:
8 f+ a( ]* o+ f/ S; T+ J$ Z1 R+ k, ]- d/ N: D5 g# o
输入样例 / E' F! d( Y$ F& H8 P: t; ~6 J% q
7 t7 K2 u) |3 I$ O. g* J) R- ^4 r3 / [. B( |6 z" j; v/ E% ?
( j1 v+ k/ O0 W4 p/ z1 w Z& T23 ! O; A5 ?6 P/ {/ W. U% k
" s) R* t7 ` ~2 Q7 X6 h
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
- J. d' Z3 m/ l3 J; X8 q. }- M7 m, l0 O. _/ g
25 ( K3 r8 T0 K: G4 I
1 J- C5 M7 f) \7 k) f/ ~3 @8 J' b0 a9 3 8 5 4 8 3 9 8 4 X X X X 2 X X X X 2 8 4 9 2 4
L/ I& W1 A I3 P9 ^3 g/ C- A* p* ~7 p7 A, Z( @
43 3 f& t2 N' Y n. S
+ a) P6 \: W8 A/ b; {( u5 h+ K
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 , n, o0 k' d5 \, U5 ^' t! ~0 R$ x
. A) x, w. |, s2 l1 m: e# r& `0 e5 V; d6 ?" H0 _
输出样例 0 A1 b8 X, Z; n7 Y6 u, x3 o
) \ e$ x7 `8 z# A3 O
21:17
3 x0 k* v" ]6 x2 q [3 I/ }# M4 m" o' e6 k& T
24:22
" U. e& _! T- l+ {' r9 `3 Y9 C! c% v3 J- I& U
21:3
# Q# R1 e8 o. E+ D$ |1 z
! V+ I( x. G! n% R8 aUnknown
; S: E2 R! X! O) ]
7 k- L$ A% m. p; D$ _( {9 _: l21:14 ) v; ~ l+ K: t6 U
& K. e2 S+ P ^' t20:22
9 q% _+ Y, C( N, G4 _7 K+ p: m, ?( r3 I9 n( \+ ~. y# U% }6 t
21:23 9 x5 `7 ]# i. c
5 j- {! }- D5 x% e4 u21:16 . Z/ x1 T( V5 L8 D$ r
1 g4 R! K" i: D
21:9
; R$ I3 c) ?, n3 Z . B2 _/ p0 w2 E$ w! N% B
, z7 s& s4 o! K: L& ~example: public class GouGouShiJiFen {
6 Z. z* U/ J4 Y- G% d0 L$ F; q8 k6 y# ?3 z# ]" W' N+ o# {
public int[][] bs = new int[5][2];//当前可能的比赛结果
8 E6 P! U; g% g6 q7 N, r* l9 M// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果8 {6 N- D0 L0 A! a( T: Z
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份+ o# I% h( Q# ]4 c8 \# n2 y
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
. X$ Q. D8 C H; ~; v% x public int numOfAbleJu = 0; //本行比赛可能的结果有几种
. E& i6 y% [3 }5 K+ H
- e. O9 z! a+ |) F5 Q6 O /**8 }' t% C6 b* \
* @param index 连续得失分的index
! \* I$ Q7 A2 q( ]4 Z/ H * @param scene 第几局比赛% D2 q' o, P. V4 Q, ]' ~1 ^! \6 ~
* @param whichPlayer index处分为哪个选手得分
1 m/ H' ^' T& X5 x * @param record GuoGuo记的一行分
2 X. m5 G/ E- G) I% s* l * @return 是否是一种可能的比赛结果
+ C6 p4 C5 X \& U6 ?- S */3 R. v2 R8 V& I* B$ ^
public boolean check(int index, int scene, int whichPlayer, int[] record) {- R+ [* p* X7 T7 x& h/ d
int playerIndex = whichPlayer;
+ G" F( t+ i, Y$ x1 D$ L& Q boolean isWanZhengJu = false;
8 w) c2 P( W$ t+ y& r for (int i = index; i < record.length; i++) {
5 \0 N; m# Q1 S- Q9 f$ [- b+ i isWanZhengJu = false;
. r* A2 S$ M! r+ [6 C playerIndex = (whichPlayer + i - index) % 2;. Y; N/ k. c# x0 m& D1 Y
bs[scene][playerIndex] += record;
/ h: }& d4 t6 b7 o1 V1 V. ^ if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
7 X) H$ z- J4 M, f. U if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
" ~1 ~7 r9 i" n scene++;4 F) v: R( N5 N
whichPlayer = scene % 2;7 L2 l( g3 B( _
index = i + 1;
' y. C4 ~9 s! C4 [$ B isWanZhengJu = true;
" E: n) ^1 W" N/ W, W5 C continue;
8 b8 H O* h+ G8 P$ R! W0 t0 V } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的8 S& E( q! {* j# U
return false;
7 t! e4 v: V& n }* r+ }/ m) f2 u6 U% `
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
; d0 }+ I- ]4 _3 r$ K1 c return false;3 G( z! O: ?& J- u
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
4 o8 {- L$ v2 F. g5 {8 _) E7 ^. ] scene++;
4 y! y. u6 ~' d+ T! D* b whichPlayer = scene % 2;
) \0 R$ G% u0 y index = i + 1;
' B0 M1 v/ W& [) L! I# O* J$ Q. O isWanZhengJu = true;& Z5 z- @5 ]$ F( M! }
continue;
! i0 X8 d5 a n6 a! d3 X; Q }
* Q- O9 `; Y& X5 I2 V9 w0 [ if (record == 10 && i != (record.length - 1)) { //下一个数分情况
) d" Q4 R5 x/ a& H- S/ m" D+ R2 p' ? int[][] bsBak = new int[5][2];
+ C2 o6 Z8 S% z8 m" d' D cpy2deepArr(bs, bsBak);
+ P8 m! l5 b! g) _# Y if (check(i + 1, scene, playerIndex, record)) {
( t# i; `1 p4 d cpy2deepArr(bsBak, bs);
5 t4 E4 |! v S6 T4 ~( a if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误. z. Y$ a$ s- b4 M6 I! p. G
return false;
' }# g8 x8 E. F, J& j. h+ K" T. b }1 Y; I1 {4 e5 M V0 }
return numOfAbleJu < 2;8 r' c6 h6 S' Z3 |
} else {
8 G. R/ u5 l+ @, T) ^7 d cpy2deepArr(bsBak, bs);
8 f5 F) e& C, @2 ~' E8 {/ H# P2 r if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
5 g9 A( `* Q* L, } return numOfAbleJu < 2;- K# r; n! v' G" I0 o
}
& B+ ? o2 x6 s }3 t; m7 w+ }: f/ \
return false;
6 b4 H' s( e- A: w }' v# e6 U5 D$ w& c% A$ p
}, o% f; x3 \. h" R6 P+ ?4 u
4 l" o2 G- m |4 k: r if (!isWanZhengJu) {
: Y8 X* t0 l" M return false;' Z3 V9 t4 d* ?3 \
}) h) t: i5 a9 l
// //检查是否符合五局三胜
) K7 Q- S2 V m) F// int a = 0, b = 0;5 q/ g' ^' M6 R4 n) ^2 F6 r# h( p p
// for (int i = 0; i < bs.length; i++) {
' j9 ]) G$ {& l// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
T0 Y0 _# [! J3 |, L; n2 }0 a// break;
/ C. M* e( B* n7 O/ O9 s1 l$ z$ [// }6 M' l2 d% f+ S/ s6 z2 x5 c2 f3 R! m
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
& ?* b' V8 I4 j// return false;
4 T' `% }- A3 `! ^+ o; s4 Q7 Z// }2 S v- w2 r" r3 m
// if (bs[0] > bs[1]) {0 P8 s$ m* ]) {! a
// a++;
' ^/ ~2 M0 _* q& d7 m// } else {6 M6 G( q2 x o+ J: c
// b++;4 V. x I) B R9 p) `; V( b
// }% `0 d+ s" q& M1 v& |7 H1 v' H
// }% w' ]# }- \4 n; g! N
// if (a < 3 && b < 3) {//没有一个人得三局,故错误$ |& \" a2 ^6 a( ]/ l
// return false;& ^, ^ y1 D& z+ z+ q) ~
// }) N" x$ W" D& i+ o2 b7 a0 @9 C
//只要有三局及以上正常结果,则可视为OK: y5 I# y: K; Z4 A" \
int count = 0;
5 c" i: w$ X0 F for (int i = 0; i < bs.length; i++) {, t$ ]: L1 h" A0 `
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
4 t2 W; g7 q, Z' m Q/ T5 C( p break;
8 F. y6 {* h$ M: O' I. } y4 X" L }. \9 d' t1 O) G6 a i3 K0 W
count++;( |+ O! s. x, s, S( {; f m! H
}
8 V5 H6 \8 e2 ?' U9 O$ ~$ |+ C if (count < 3) {
! |9 O- R# e$ S- {* f2 h3 l return false;4 U% _7 y, g$ q5 f+ ~ r4 U" l
}
2 U. x) b7 q8 z8 z , X8 D" U7 y! T* M3 x
numOfAbleJu += 1;+ T b$ ^ T$ }/ c' M, V5 Q5 V
return true;
7 o/ |" |. j* d& d. {/ f5 y. K. k, K }
0 C! b7 ~& }# S& R& i4 d# w private void cpy2deepArr(int[][] src, int[][] dest) {
3 ]2 h7 D2 y" _5 j6 |+ i7 H for (int i = 0; i < src.length; i++) {$ m T2 O" ^( i. _
for (int j = 0; j < src.length; j++) {
6 R$ C$ m& V4 K5 @# d! W. {9 h9 L dest[j] = src[j];, p( ]" X/ Y1 w# r' I
}- p0 i- ~5 B+ h4 q$ l# a
}4 K6 p) [6 \# F& ? n
}
: w" i* `9 i1 R7 M( y 7 X9 ]- Q, D+ \1 V# d$ C' B
public void printNowCheck() {2 G6 j5 a; L& k- l, k1 B* z
for (int i = 0; i < bs.length; i++) {7 N$ y' b8 n a1 r5 Q) z
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
/ I* W" w9 c/ ?; p0 B$ @% i break;
2 N9 r$ s- m3 f8 V9 n }5 s9 j, C0 ]( A5 R3 q- i& B
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
# D9 j( J* h$ P8 w6 s if (bs[0] > bs[1]) {( g! B: \# s- M! w! Y/ K3 Y* u
System.out.println(bs[0] + ":" + bs[1]);# e8 [/ G0 D% n0 p2 }" }. m1 h
} else { w! |( N8 U& {) I
System.out.println(bs[1] + ":" + bs[0]);
; `% _: R6 L0 R' H# y }
" o; \7 q' Y) A1 L( |; _ }
/ e5 w& A# D O/ a1 Q# ~% L }$ u6 w% O# a; F0 [$ U9 M8 t
public void resetCheck() {
" W* X6 y8 V% I for (int i = 0; i < bs.length; i++) {
- o3 c4 t ~1 d8 L9 h) n0 h bs[0] = 0;# e: p6 z& ?+ H H+ @
bs[1] = 0;+ \9 i* t# I' h K v
}* L7 k1 B1 i( T& ?6 y* ?" ?% Q- ?
}
4 D0 l4 V; W- n6 D3 u /**
- n, J* i$ o) Y' D8 Z. _7 e. Y2 u * @param args
8 W8 {2 w+ ^+ T$ n. [: ]1 F */
4 B; R. m9 Y$ H; E" O. I4 F" C public static void main(String[] args) {% \+ J E F# G2 E2 ?( Q# V V5 [
// TODO Auto-generated method stub
, x6 ]+ J! b$ |! q GouGouShiJiFen obj = new GouGouShiJiFen();1 v x1 f# H$ x0 k0 {
int[][] testData = {
( h% B+ l9 P3 b3 Y! b {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},! M9 q0 d7 J$ `2 {! L
{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},/ |, w& B8 C7 {1 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}2 ^; E, g7 q3 R$ r! k* \
};; v9 Q+ t X: y0 | w& {9 F+ Q0 t
for (int i = 0; i < testData.length; i++) {
7 \( }! q! Q5 b0 O if (obj.check(0, 0, 0, testData)) {
2 T& H! ^% g5 p- b8 V5 j obj.printNowCheck();
; H/ u S: Z& V1 r } else {* Y# h+ I9 [5 K
System.out.println("Unknown");2 T' |4 \1 \: F2 K7 U) b3 ~
}
1 B& p% V5 J% ]2 f, x% i$ E obj.resetCheck();
3 E1 w& _" J" |( d }
6 }* C. h7 x# N6 J" c, Y }
# y/ P; q b* J8 R: ~ p* X2 N- O( _
} |