到底是签到题还是英语阅读理解题 /????

今天解决了一个问题耗费了我很长时间,就是说现在有两个人,qq和cc,他们两个人在下棋,各有白色棋子和黑色棋子,分别给出棋子的落点以A1的形式,(A1到H8 64个格子),每个人可以选择一条线上的点,清除掉,一人一次in turns ,现在qq先手,看谁先清除完毕,输入的第一行是白子个数(belongs to qq)然后 白字位置,然后黑子个数,然后位置,好的,现在开始解决问题,需要找出,点最多的一条线,删掉,然后步数++,然后到没有点,然后比较两个人所需步数,便得结论,

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int x;
    int y;
} qs[32],cs[32];//用一个结构体来记录点,通过个数来算;
struct maxn
{
    int x;
    struct maxn *next;
}*headq,*headc;
int main()
{
    headq=new maxn;
    headc=new maxn;
    headq->next=NULL;
    headc->next=NULL;
    char s1,s2;
    int m,n,a,b;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        getchar();
        scanf("%c%c",&s1,&s2);
        qs[i].x=s1-'A';
        qs[i].y=s2-'1';
    }
    scanf("%d",&m);
    for(int i=0; i<m; i++ )
    {
        getchar();
        scanf("%c%c",&s1,&s2);
        cs[i].x=s1-'A';
        cs[i].y=s2-'1';
    }
    struct maxn *sss;
    int ansq=0,ansc=0;
    while(n>2)
    {
        int ma=2;
        int mmm=2;
        for(int i=0; i<n; i++)//找到第一个点
        {
            sss=new maxn;
            sss->x=i;
            sss->next=NULL;
            headc->next=sss;
            struct maxn *p;
            p=headc->next;//把第一个点放进一个空链表
            for(int j=i+1; j<n; j++)//找到第二个点
            {
                p=headc->next;
                ma=2;

                sss=new maxn;
                sss->next=NULL;
                sss->x=j;
                p->next=sss;
                p=p->next;//把第二个点放进链表
                headq->next=headc->next;
                double k;
                if((qs[j].x-qs[i].x)!=0)
                {
                    k=1.0*(qs[j].y-qs[i].y)/(qs[j].x-qs[i].x);
                }
                else
                {
                    k=100;
                }
                //cout<<'0';
                //计算线段的斜率k
                for(int r=j+1; r<n; r++)//看剩下的点是否是这条线上的
                {
                    if(1.0*(qs[r].y-qs[i].y)/(qs[r].x-qs[i].x)==k)//如果后面在这条线上
                    {
                        //printf("%d %d %d %d",i,j,r,n);
                        ma++;//点数+1
                        sss=new maxn;
                        sss->next=NULL;
                        sss->x=r;
                        p->next=sss;
                        p=p->next;//把点放进链表
                        if(ma>mmm)//更新现存最大的链表长度
                        {
                            headq->next=headc->next;
                            mmm=ma;
                        }
                        if(mmm==n)
                        {
                            i=n;
                            break;
                        }
                    }

                }
            }
        }//找到最大的链表长度,是mmm,现在把mmm个点去掉;把结构体里的点移到前面去,把n改动,记录步骤;
        struct maxn *q;
        q=headq->next;
        while(q!=NULL)
        {
            int vv=q->x;
            qs[vv].x=-1,qs[vv].y=-1;
            q=q->next;
        }
        n=n-mmm;
        int i=0,sv=1;
        while(i<n)
        {
            // printf("kssd\n");
            if(qs[i].x==-1&&qs[i].y==-1)
            {
                qs[i]=qs[sv];

                qs[sv].x=-1;
                qs[sv].y=-1;
                sv++;
            }
            else i++;
        }
        ansq++;
    }
    if(n==1||n==2) ansq++;





    headc=new maxn;
    headq=new maxn;
    headq->next=NULL;
    headc->next=NULL;
    while(m>2)
    {
        int ma=2;
        int mmm=2;
        for(int i=0; i<m; i++)//找到第一个点
        {
            sss=new maxn;
            sss->x=i;
            sss->next=NULL;
            headc->next=sss;
            struct maxn *p;
            p=headc->next;//把第一个点放进一个空链表
            for(int j=i+1; j<m; j++)//找到第二个点
            {
                p=headc->next;
                ma=2;
                sss=new maxn;
                sss->next=NULL;
                sss->x=j;
                p->next=sss;
                p=p->next;//把第二个点放进链表
                headq->next=headc->next;
                double k;
                if((cs[j].x-cs[i].x)!=0)
                {
                    k=1.0*(cs[j].y-cs[i].y)/(cs[j].x-cs[i].x);
                }
                else
                {
                    k=100000;
                }
                //计算线段的斜率k
                for(int r=j+1; r<m; r++)//看剩下的点是否是这条线上的
                {
                    if(1.0*(cs[r].y-cs[i].y)/(cs[r].x-cs[i].x)==k)//如果后面在这条线上
                    {
                        //printf("%d %d %d %d",i,j,r,n);
                        ma++;//点数+1
                        sss=new maxn;
                        sss->next=NULL;
                        sss->x=r;
                        p->next=sss;
                        p=p->next;//把点放进链表
                        if(ma>mmm)//更新现存最大的链表长度
                        {
                            headq->next=headc->next;
                            mmm=ma;
                        }
                        if(mmm==m)
                        {
                            i=m;
                            break;
                        }
                    }

                }
            }
        }//找到最大的链表长度,是mmm,现在把mmm个点去掉;把结构体里的点移到前面去,把n改动,记录步骤;

        struct maxn *q;
        q=headq->next;
        while(q!=NULL)
        {
            int vv=q->x;
            cs[vv].x=-1,cs[vv].y=-1;
            q=q->next;
        }
        m=m-mmm;
        int i=0,sv=1;
        while(i<m)
        {
            if(cs[i].x==-1&&cs[i].y==-1)
            {
                cs[i]=cs[sv];

                cs[sv].x=-1;
                cs[sv].y=-1;
                sv++;
            }
            else i++;
        }
        ansc++;
    }
    if(m==1||m==2) ansc++;
    else ;
    if(ansq<=ansc) printf("Cuber QQ\n");
    else  printf("Quber CC\n");
    return 0;
}

好的,现在写完代码,debug也完成了,为啥不对呢,我又改了几处数据后,还是被卡,然后我机智(dai zhi)的看了一遍题,啊哎呀,
我发现了这道题,问的是:每个人可以选择一条线 的一个点或者23456789.。。个点拿掉,看谁拿的慢,,,慢~~~~哦买噶 OMG omg 那,,,谁点多的话,每次都取一个,不就行了,我的妈,然后两分钟ac了,,,所以,大家看题一定不要想当然,加油,希望大家永远不要卡在签到题四个小时
这里有题目
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值