题目链接:1018 锤子剪刀布
分析
用一个二维数组保存两人所有回合的手势甲乙的胜,平,负的次数刚好相反,用3个变量表示就可以手势单独保存在signs[3]中,注意顺序。题目原文:如果解不唯一,则输出按字母序最小的解。注意input()中的getchar()不能省略
C
#include<stdio.h>
#include<stdlib.h>
int n
;
char** sign
;
int winJia
, levelJia
, loseJia
;
int numSignWin
[2][3] = { 0 };
char signs
[3] = { 'B','C','J' };
void input() {
scanf("%d", &n
);
sign
= (char**)malloc(n
* sizeof(char*));
for (int i
= 0; i
< n
; i
++) {
sign
[i
] = (char*)malloc(2 * sizeof(char));
}
for (int i
= 0; i
< n
; i
++) {
getchar();
scanf("%c %c", &sign
[i
][0], &sign
[i
][1]);
}
}
void judge(char jia
, char yi
) {
if (jia
== yi
) {
levelJia
++;
}
else if (jia
== signs
[0] && yi
== signs
[1]) {
winJia
++;
numSignWin
[0][0]++;
}
else if (jia
== signs
[0] && yi
== signs
[2]) {
loseJia
++;
numSignWin
[1][2]++;
}
else if (jia
== signs
[1] && yi
== signs
[0]) {
loseJia
++;
numSignWin
[1][0]++;
}
else if (jia
== signs
[1] && yi
== signs
[2]) {
winJia
++;
numSignWin
[0][1]++;
}
else if (jia
== signs
[2] && yi
== signs
[0]) {
winJia
++;
numSignWin
[0][2]++;
}
else if (jia
== signs
[2] && yi
== signs
[1]) {
loseJia
++;
numSignWin
[1][1]++;
}
}
int maxIndex(int who
) {
int max
= numSignWin
[who
][0];
int index
= 0;
for (int i
= 0; i
< 3; i
++) {
if (max
< numSignWin
[who
][i
]) {
max
= numSignWin
[who
][i
];
index
= i
;
}
}
return index
;
}
void output() {
printf("%d %d %d\n", winJia
, levelJia
, loseJia
);
printf("%d %d %d\n", loseJia
, levelJia
, winJia
);
printf("%c ", signs
[maxIndex(0)]);
printf("%c\n", signs
[maxIndex(1)]);
}
int main() {
input();
winJia
= levelJia
= loseJia
= 0;
for (int i
= 0; i
< n
; i
++) {
judge(sign
[i
][0], sign
[i
][1]);
}
output();
return 0;
}
Java
import java
.util
.Scanner
;
public class Main {
private int n
;
private char[][] sign
;
private int winJia
, levelJia
, loseJia
;
private int[] numSignWinJia
= new int[3];
private int[] numSignWinYi
= new int[3];
private char[] signs
= { 'B', 'C', 'J' };
public Main() {
input();
for (int i
= 0; i
< n
; i
++) {
judge(sign
[i
][0], sign
[i
][1]);
}
output();
}
private void input() {
Scanner sc
= new Scanner(System
.in
);
n
= sc
.nextInt();
sign
= new char[n
][2];
for (int i
= 0; i
< n
; i
++) {
sign
[i
][0] = sc
.next().charAt(0);
sign
[i
][1] = sc
.next().charAt(0);
}
sc
.close();
}
private void judge(char jia
, char yi
) {
if (jia
== yi
) {
levelJia
++;
} else if ('C' == jia
&& 'J' == yi
) {
numSignWinJia
[1]++;
winJia
++;
} else if ('C' == jia
&& 'B' == yi
) {
numSignWinYi
[0]++;
loseJia
++;
} else if ('J' == jia
&& 'C' == yi
) {
numSignWinYi
[1]++;
loseJia
++;
} else if ('J' == jia
&& 'B' == yi
) {
numSignWinJia
[2]++;
winJia
++;
} else if ('B' == jia
&& 'C' == yi
) {
numSignWinJia
[0]++;
winJia
++;
} else if ('B' == jia
&& 'J' == yi
) {
numSignWinYi
[2]++;
loseJia
++;
}
}
private void output() {
System
.out
.println(winJia
+ " " + levelJia
+ " " + loseJia
);
System
.out
.println(loseJia
+ " " + levelJia
+ " " + winJia
);
System
.out
.print(signs
[maxIndex(numSignWinJia
)]);
System
.out
.print(" ");
System
.out
.println(signs
[maxIndex(numSignWinYi
)]);
}
private int maxIndex(int[] num
) {
int index
= 0;
int max
= num
[0];
for (int i
= 1; i
< 3; i
++) {
if (max
< num
[i
]) {
max
= num
[i
];
index
= i
;
}
}
return index
;
}
public static void main(String
[] args
) {
new Main();
}
}
版权声明:
转载请于首页注明链接形式的PAT(B) 1018 锤子剪刀布(C:20分,Java:18分)——wowpH;代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);如果有疑问欢迎评论留言,尽量解答。