#include #include #include #include #include using namespace std; struct solution { int sum,px[200],py[200],br; }; int n,k,r,a[200][200],br=0,points[200][200],res=0,topx[201],topy[201],topsum[201],topbr,l=0; int fr1[200][200],frn[200][200]; const double time_limit=4.6; bool is_time_ok () { return (double (double (clock ()) / double (CLOCKS_PER_SEC)) < time_limit); } int how_many_points(int x,int y) { int sum=0,i,j,frequency[51],k1=min(x+r,n-1),k2=max(x-r,0),p1=min(y+r,n-1),p2=max(y-r,0); frequency[0]=-1; for(i=1;i<=50;i++) { frequency[i]=0; } i=x; j=y; while(i<=k1 && j<=p1) { sum=sum+a[i][j]; frequency[a[i][j]]++; i++; j++; } i=x-1; j=y-1; while(i>=k2 && j>=p2) { sum=sum+a[i][j]; frequency[a[i][j]]++; i--; j--; } i=x; j=y; while(i>=k2) { sum=sum+a[i][j]; frequency[a[i][j]]++; i--; } i=x+1; while(i<=k1) { sum=sum+a[i][j]; frequency[a[i][j]]++; i++; } i=x; while(j<=p1) { sum=sum+a[i][j]; frequency[a[i][j]]++; j++; } j=y-1; while(j>=p2) { sum=sum+a[i][j]; frequency[a[i][j]]++; j--; } i=x; j=y; while(i<=k1 && j>=p2) { sum=sum+a[i][j]; frequency[a[i][j]]++; i++; j--; } i=x-1; j=y+1; while(i>=k2 && j<=p1) { sum=sum+a[i][j]; frequency[a[i][j]]++; i--; j++; } sort(frequency,frequency+51); return sum*frequency[50]; } int place_queen(int x,int y,int fr3[200][200]) { int i=x+1,j=y+1,k1=min(x+r,n-1),k2=max(x-r,0),p1=min(y+r,n-1),p2=max(y-r,0); fr3[x][y]=1002; while(i<=k1 && j<=p1) { fr3[i][j]++; i++; j++; } i=x-1; j=y-1; while(i>=k2 && j>=p2) { fr3[i][j]++; i--; j--; } i=x-1; j=y; while(i>=k2) { fr3[i][j]++; i--; } i=x+1; while(i<=k1) { fr3[i][j]++; i++; } i=x; j=y+1; while(j<=p1) { fr3[i][j]++; j++; } j=y-1; while(j>=p2) { fr3[i][j]++; j--; } i=x+1; j=y-1; while(i<=k1 && j>=p2) { fr3[i][j]++; i++; j--; } i=x-1; j=y+1; while(i>=k2 && j<=p1) { fr3[i][j]++; i--; j++; } return fr3[200][200]; } int for_solve(int x,int y) { int i=x+1,j=y+1,k1=min(x+r,n-1),k2=max(x-r,0),p1=min(y+r,n-1),p2=max(y-r,0),sum=points[x][y]; while(i<=k1 && j<=p1) { if(fr1[i][j]==0)sum=sum-points[i][j]; i++; j++; } i=x-1; j=y-1; while(i>=k2 && j>=p2) { if(fr1[i][j]==0)sum=sum-points[i][j]; i--; j--; } i=x-1; j=y; while(i>=k2) { if(fr1[i][j]==0)sum=sum-points[i][j]; i--; } i=x+1; while(i<=k1) { if(fr1[i][j]==0)sum=sum-points[i][j]; i++; } i=x; j=y+1; while(j<=p1) { if(fr1[i][j]==0)sum=sum-points[i][j]; j++; } j=y-1; while(j>=p2) { if(fr1[i][j]==0)sum=sum-points[i][j]; j--; } i=x+1; j=y; while(i<=k1 && j>=p2) { if(fr1[i][j]==0)sum=sum-points[i][j]; i++; j--; } i=x-1; j=y+1; while(i>=k2 && j<=p1) { if(fr1[i][j]==0)sum=sum-points[i][j]; i--; j++; } return sum; } void solve () { int i,j,nu=0,maxx,maxy,sum=20000; for(i=0;isum || sum==20000) { sum=nu; maxx=i; maxy=j; } } } } if(sum!=20000) { fr1[200][200]=place_queen(maxx,maxy,fr1); printf("%d %d\n",maxx+1,maxy+1); res=res+points[maxx][maxy]; solve(); } else { return; } } solution after_solve(int fr2[200][200],int t,int x,int y,int index,int number) { int frn2[200][200]; if(index>=0) { int i,j; solution result,work; result.br=index+1; result.sum=points[x][y]; result.px[index]=x; result.py[index]=y; if(t==0 || is_time_ok()==false) { return result; } fr2[200][200]=place_queen(x,y,fr2); for(i=0;iresult.sum) { result.br=work.br+1; result.sum=points[x][y]+work.sum; result.px[index]=x; result.py[index]=y; for(j=index+1;jresult.sum) { result=work; } } } return result; } } int main () { int i,j,j2; solution s,work; s.sum=0; s.br=0; freopen ("queens.in", "r", stdin); freopen ("queens.out", "w", stdout); scanf("%d %d %d",&n,&r,&k); for(i=0;i=0) { if(topsum[j2+1]>topsum[j2]) { swap(topsum[j2+1],topsum[j2]); swap(topx[j2+1],topx[j2]); swap(topy[j2+1],topy[j2]); } else break; } } if(topbr<201 && fr1[i][j]<=k) { topsum[topbr]=points[i][j]; topx[topbr]=i; topy[topbr]=j; topbr++; } } } i=1; while(i<=topbr && is_time_ok()==true) { //cout<