Arithmetic Progressions 剪枝做的不好,最后险过

Arithmetic Progressions 剪枝做的不好,最后险过

/*
ID: skylove3
PROG: ariprog
LANG: C++
*/
#include<iostream>
#include<algorithm>
#include<fstream>
#include<cstring>
using namespace std;
//=========================================
struct Point//记录符合条件的坐标
{
int x;
int y;
};
Point s[130000];//数组开小了,剪枝
int cmp( const void *a , const void *b )//结构体排序,妙
{    
struct Point *c = (Point *)a;
     struct Point *d = (Point *)b;
     if(c->y != d->y) 
return c->y - d->y;
     else return c->x - d->x;
}
Point q;
int length,M;
int p[130000];
int mark[130000];
int k=0;
void Search(const int &a,const int &b,const int &n)
{
if(n==length)//出口
{
q.x=a;
q.y=b;
s[k]=q;
k++;
return ;
}
else
{
if(mark[a+n*b]==1)//标记
{
Search(a,b,n+1);
}
else
{
return;
}
}
}
int main()
{
ofstream fout("ariprog.out");
ifstream fin("ariprog.in");
fin>>length>>M;
    memset(p,0,sizeof(p));
int t=1;
for(int i=0;i<=M;++i)
{
for(int j=0;j<=M;++j)
{  
p[t]=i*i+j*j;
mark[p[t]]=1;
t++;
}
}
for(int i=1;i<=(M+1)*(M+1);++i)
{
for(int j=1;j<=(M+1)*(M+1)/2;++j)
{
if(i+(length-1)*j>2*(M+1)*(M+1))//剪枝,此处在主程序中
{
break;
}
   Search(p[i],j,1);
}
}
int flag=0;
int sum=0;
for(int i=0;i<1000;i++)
{
if(s[i].x==0&&s[i].y==0)
{   
sum=i+1;
break;
}
}
for(int i=0;i<sum;++i)
{
if(s[i].x!=0||s[i].y!=0)
{
flag=1;
break;
}
}
if(flag==0)
{
fout<<"NONE"<<endl;
return 0;
}
qsort(s,sum,sizeof(s[0]),cmp);
for(int i=0;i<sum;++i)
{
if((s[i].x==0&&s[i].y==0)||(s[i].x==s[i-1].x&&s[i].y==s[i-1].y))
{
continue;
}
fout<<s[i].x<<" "<<s[i].y<<endl;
}
}

你可能感兴趣的:(Arithmetic Progressions 剪枝做的不好,最后险过)