今天解决了一个问题耗费了我很长时间,就是说现在有两个人,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了,,,所以,大家看题一定不要想当然,加油,希望大家永远不要卡在签到题四个小时
这里有题目