总结
这次打了一次usaco,因为一时犯贱,我就为我的作死付出了惨重的代价。因为看第一题似乎好像也许可能应该比较无脑,于是我决定先把第一题ac了,再去看第二题。
第一题就是一堆奶牛下井字棋,3*3的。每个格子上会有一个字母,代表这个格子是那个奶牛下的。读入整个棋局,输出如果一个奶牛一队那么会有几只奶牛会获胜,由于奶牛们认为多牛游戏不容易获胜,所以他们决定让两个奶牛为一队。所以还要输出如果任意两个奶牛组为一队会有多少队奶牛获胜。
我刚看完题目就有了思绪:一个奶牛一队,那么就等于每一行,每一列,还有两条对角线上一共有多少条线是三个都是相同的;两头奶牛一队,那么就等于每一行,每一列,还有两条对角线上一共有多少条线是两个是相同的。而且只有3*3的,再怎么搞也不会超时(如果你比我还作死,那么请自便)。所以我为了图省事,我决定用略微简化了一点点的暴力。由于我只存了最后的没ac的结果,所以这里就不提供代码了。打的程序大约只有四五十行。经过各种艰难险阻,我成功把我的程序提交了上去,只有五十分。
后来发现我的程序中有太多太多的漏洞,简直惨不忍睹。我就不一一举例了(以免被。。。。。。。),检查了一遍,又提交了一遍。还是五十分。然后我就十分惊讶了。不是为我这次的成绩感到惊讶,而是为我第一次的成绩感到惊讶。我那个漏洞多得可以填满我的脑洞的程序居然拿了五十分。这个分数要不要怎么好骗啊。我真的是无语了,这个数据真的有点水。。。。。。。。
可是我却并没有发现我的思路有个明显的漏洞。相信明眼的观众已经知道了。就是如果一头奶牛或者一队奶牛占了两条线,那么按我一开始的思绪来,就会算两次,而题目只能算一次。由于我要去数学竞赛,所以本来就时间紧迫,而且我还要作死,所以当我发现这个漏洞的时候已经快要结束了。我赶紧用了一个二维数组把满足条件的奶牛和奶牛团体存了进去。代码如下(后来我决定打暴力,所以代码很长):
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("tttt.in","r",stdin);
freopen("tttt.out","w",stdout);
char a[4][4]={},name[2][100];
int b=0,c=0,k,z=0;
for (int i=1;i<=3;i++)
for (int j=1;j<=3;j++)
cin>>a[i][j];
k=0;
for (int j=1;j<=3;j++) if (a[1][j]==a[1][j+1]) k++;
if (a[1][1]==a[1][3]) k++;
if (k==3)
{
z++;
name[1][z]=a[1][1];
b++;
}
if (k==1)
{
z++;
if (a[1][1]==a[1][2]) name[1][z]=a[1][1];
else if (a[1][1]==a[1][3]) name[1][z]=a[1][1];
else name[1][z]=a[1][2];
c++;
}
k=0;
for (int j=1;j<=3;j++) if (a[j][1]==a[j+1][1]) k++;
if (a[1][1]==a[3][1]) k++;
if (k==3)
{
z++;
name[2][z]=a[1][1];
b++;
}
if (k==1)
{
z++;
if (a[1][1]==a[2][1]) name[2][z]=a[1][1];
else if (a[1][1]==a[3][1]) name[2][z]=a[1][1];
else name[2][z]=a[2][1];
c++;
}
//1
k=0;
for (int j=1;j<=3;j++) if (a[2][j]==a[2][j+1]) k++;
if (a[2][1]==a[2][3]) k++;
if (k==3)
{
z++;
name[1][z]=a[2][1];
b++;
}
if (k==1)
{
z++;
if (a[2][1]==a[2][2]) name[1][z]=a[2][1];
else if (a[2][1]==a[2][3]) name[1][z]=a[2][1];
else name[1][z]=a[2][2];
c++;
}
k=0;
for (int j=1;j<=3;j++) if (a[j][2]==a[j+1][2]) k++;
if (a[1][2]==a[3][2]) k++;
if (k==3)
{
z++;
name[2][z]=a[1][2];
b++;
}
if (k==1)
{
z++;
if (a[1][2]==a[2][2]) name[2][z]=a[1][2];
else if (a[1][2]==a[3][2]) name[2][z]=a[1][2];
else name[2][z]=a[2][2];
c++;
}
//2
k=0;
for (int j=1;j<=3;j++) if (a[3][j]==a[3][j+1]) k++;
if (a[3][1]==a[3][3]) k++;
if (k==3)
{
z++;
name[1][z]=a[3][1];
b++;
}
if (k==1)
{
z++;
if (a[3][1]==a[3][2]) name[1][z]=a[3][1];
else if (a[3][1]==a[3][3]) name[1][z]=a[3][1];
else name[1][z]=a[3][2];
c++;
}
k=0;
for (int j=1;j<=3;j++) if (a[j][3]==a[j+1][3]) k++;
if (a[1][3]==a[3][3]) k++;
if (k==3)
{
z++;
name[2][z]=a[1][3];
b++;
}
if (k==1)
{
z++;
if (a[1][3]==a[2][3]) name[2][z]=a[1][3];
else if (a[1][3]==a[3][3]) name[2][z]=a[1][3];
else name[2][z]=a[2][3];
c++;
}
//3
k=0;
if (a[1][1]==a[2][2]) k++;
if (a[2][2]==a[3][3]) k++;
if (a[1][1]==a[3][3]) k++;
if (k==3)
{
z++;
name[1][z]=a[1][1];
b++;
}
if (k==1)
{
z++;
if (a[1][1]==a[2][2]) name[1][z]=a[1][1];
else if (a[1][1]==a[3][3]) name[1][z]=a[1][1];
else name[1][z]=a[2][2];
c++;
}
k=0;
if (a[1][3]==a[2][2]) k++;
if (a[2][2]==a[3][1]) k++;
if (a[3][1]==a[1][3]) k++;
if (k==3)
{
z++;
name[2][z]=a[1][3];
b++;
}
if (k==1)
{
z++;
if (a[1][3]==a[2][2]) name[2][z]=a[1][3];
else if (a[1][3]==a[3][1]) name[2][z]=a[1][3];
else name[2][z]=a[2][2];
c++;
}
for (int z=1;z<=2;z++)
for (int i=1;i<=z;i++)
for (int j=1;j<=z;j++)
if (i!=j&&name[z][i]==name[z][j])
{
if (z==1) b--;
else c--;
name[z][j]='0';
}
cout<<b<<endl;
cout<<c;
fclose(stdin);
fclose(stdout);
return 0;
}
打完程序我还没注意到其实还有一个漏洞:就是我这个数组在存队伍的时候是存了一个队伍中占了两个格子的那头奶牛的字母,但是如果在某一条线上,这头占了两个格子的奶牛只占了一个格子,而那头只占了一个格子的奶牛却占了两个格子,那么这是不是又要减去呢?
看来usaco真的是套路啊,套中套。。。。。。。。。。。。。。。什么无脑题都只是幻想