usaco三月

                                                                                             总结

               这次打了一次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真的是套路啊,套中套。。。。。。。。。。。。。。。什么无脑题都只是幻想

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值