题面:
题目大意:
现在有26头牛(A~Z)在玩一个井字棋游戏,但是他们做了一个改进,可以使两个以上的牛参与进来。那就是两种不同的牛可以组成一队,如果他们组队后行、列或对角线只由这两种牛组成,那么算这一队赢。
要你算出不组队下有多少种牛能赢,组队后有多少种情况能赢(组队的两头牛一定不是相同类的!)
思路:
模拟题,但是细节很多。
赢的情况一共有8种,2个对角线,三个行,三个列。
1.不组队下,相同的字母组成多个赢的条件(行、列、对角线)只算一种
如:
XXX
XXX
XXX
只算一种
2.组队条件下,只有赢的条件(行、列、对角线)中包含两种牛才算
如
XXX
XDF
XFR
无论哪两个组队,都不能赢。
暴力模拟就行,详见代码。
ac丑代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include <vector>
#include<algorithm>
using namespace std;
typedef long long ll;
#define MAX 100000
#define INF 10000000
struct jin{
char N[4][4];
}temp;
int vis[26];
char v[26];
int c(jin a)//
{
memset(vis,0,sizeof(vis));
int ret = 0;
char ch;
for(int i = 0;i<3;i++)
{
int sum = 0;
ch = a.N[i][0];
for(int j = 0;j<3;j++)//行
{
if(ch == a.N[i][j])
sum++;
}
if(sum == 3 && !vis[ch-'A'])
{
ret++;
vis[ch-'A'] = 1;
}
sum = 0;
ch = a.N[0][i];
for(int j = 0;j<3;j++)//列
{
if( ch == a.N[j][i])
sum++;
}
if(sum == 3 && !vis[ch-'A'])
{
ret++;
vis[ch-'A'] = 1;
}
}
ch = a.N[1][1];
if(a.N[0][0] == a.N[1][1] && a.N[1][1] == a.N[2][2] &&(!vis[ch-'A']))//主对角线
{
ret++;
vis[ch-'A'] = 1;
}
if(a.N[0][2] == a.N[1][1] && a.N[1][1] == a.N[2][0] &&(!vis[ch-'A']))ret++;//副对角线
return ret;
}
int C(jin a,char x,char y)
{
int x1,x2;
for(int i = 0;i<3;i++)
{
x1 = 0,x2 = 0;
for(int j = 0;j<3;j++)
{
if(x == a.N[i][j])
x1++;
else if(y == a.N[i][j])
x2++;
}
if(x1 && x2 && x1+x2 == 3)return 1;
x1 = 0,x2 = 0;
for(int j = 0;j<3;j++)
{
if(x == a.N[j][i])
x1++;
else if(y == a.N[j][i])
x2++;
}
if(x1 && x2 && x1+x2 == 3)return 1;
}
//主对角线
x1 = 0,x2 = 0;
for(int i = 0;i<3;i++)
{
if(a.N[i][i] == x)x1++;
else if(a.N[i][i] == y)x2++;
}
if(x1 && x2 && x1+x2 == 3)return 1;
x1 = 0,x2 = 0;
//副对角线
for(int i = 0;i<3;i++)
{
if(a.N[i][3-i-1] == x)x1++;
else if(a.N[i][3-i+1] == y) x2++;
}
if(x1 && x2 && x1+x2 == 3)return 1;
return 0;
}
int main()
{
int sum = 0,ans = 0;
for(int i = 0;i<3;i++)
{
scanf("%s",temp.N[i]);
for(int j = 0;j<3;j++)
{
int x = temp.N[i][j]-'A';
if(!vis[x])//不同的字母存入数组
{
vis[x] = 1;
v[sum++] = x+'A';
}
}
}
int ori = c(temp);
printf("%d\n",ori);
for(int i = 0;i<sum;i++)
{
for(int j = i+1;j<sum;j++)
{
ans += C(temp,v[i],v[j]);
}
}
printf("%d\n",ans);
return 0;
}