题面:
翻译:
有一些牛在玩一个游戏:
他们把一些字母写在一个3*3的黑板上.
这些奶牛的名字的首字母分别是A…Z
如果黑板上有相同的字母能够连成一行/一列/一斜.那么名字首字母为这个字母的牛获胜.
但是这样的话太难获胜了,所以这个游戏可以允许两个人合作.
如果有两个字母可以组成一行/一列/一斜,那么两头牛合作获胜.
输入:
三行三列的9个字母
输出:
第一行是一个整数,代表能够独自取胜的牛的个数.
第二行是一个整数,代表能够合作取胜的牛有多少对.
题目分析:
这个题目并不难,就是代码量比较大.
同时要注意几个点:
- 已经能够获胜的奶牛不需要重复计算
比如
XXX
XXX
XXX
那么答案就是
1
0 - 不能抱大腿,一行/一列/一斜,需要同时含有两个字母,才能算是合作取胜,XXX这样的一行不能算作是X和A合作取胜.
代码:
#include<stdio.h>
char b[9], ans1, ans2;
bool cow[26] ,cows[26][26];
void cmp(char c1, char c2, char c3){
if(c1 == c2 && c2 == c3 && c3 == c1){
if(!cow[c1-65]){
cow[c1-65] = 1;
ans1++;
}
}
if(c1 == c2 && c1 != c3){
if(!cows[c1-65][c3-65]){
cows[c1-65][c3-65] = cows[c3-65][c1-65] = 1;
ans2++;
}
}
if(c1 == c2 && c1 != c3){
if(!cows[c1-65][c3-65]){
cows[c1-65][c3-65] = cows[c3-65][c1-65] = 1;
ans2++;
}
}
if(c1 == c3 && c1 != c2){
if(!cows[c1-65][c2-65]){
cows[c1-65][c2-65] = cows[c2-65][c1-65] = 1;
ans2++;
}
}
if(c3 == c2 && c1 != c3){
if(!cows[c1-65][c3-65]){
cows[c1-65][c3-65] = cows[c3-65][c1-65] = 1;
ans2++;
}
}
}
int main(){
for(int i = 0; i < 9; i++) scanf(" %c", b+i);
ans1 = 0; ans2 = 0;
cmp(b[0],b[1],b[2]);
cmp(b[3],b[4],b[5]);
cmp(b[6],b[7],b[8]);
cmp(b[0],b[3],b[6]);
cmp(b[1],b[4],b[7]);
cmp(b[2],b[5],b[8]);
cmp(b[0],b[4],b[8]);
cmp(b[2],b[4],b[6]);
printf("%d\n%d\n", ans1, ans2);
}