求助,神奇的问题

P1219 [USACO1.5] 八皇后 Checker Challenge

ZY_85 @ 2023-08-25 16:21:18

题目是一本通1214
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int k,n,cnt,ans[9];
bool usedi[9],usedj[9];
bool Check(int i,int j){
    int c=j-i,h=i+j;
    for(int a=1;a<=8;a++){
        int b=a+c;
        if(b<1||b>8||(a==i&&b==j))continue;
        if(usedi[a]&&usedj[b])return false;
//      if(b<1||b>8)throw -1;
    }
    for(int a=1;a<=8;a++){
        int b=h-a;
        if(b<1||b>8||(a==i&&b==j))continue;
        if(usedi[a]&&usedj[b])return false;
//      if(b<1||b>8)throw -1;
    }
    return true;
}
void Work(int indx){
//  for(int k=1;k<=8;k++)printf("%d ",ans[k]);
//  printf("\n");
//  system("Pause");
    usedi[indx]=true;
    if(indx>8){
        cnt++;
        return;
    }
    for(int j=1;j<=8;j++){
//      if(!usedj[j]){
//          for(int k=1;k<=8;k++)printf("%d ",ans[k]);
//          printf("\n");
//          printf("%d %d ",indx,j);
//          cout<<Check(indx,j)<<endl;
//          system("Pause");
//      }
        if(!usedj[j]&&Check(indx,j)){
            usedj[j]=true;
            ans[indx]=j;
            Work(indx+1);
            if(cnt==n){
                for(int i=1;i<=8;i++)printf("%d ",ans[i]);
                printf("\n");
                throw "Finish";
            }
            usedj[j]=false;
            ans[indx]='\0';
        }
    }
    usedi[indx]=false;
    return;
}
int main(){
    scanf("%d",&k);
    for(int i=1;i<=k;i++){
        scanf("%d",&n);
        cnt=0;
        memset(usedi,0,sizeof(usedi));
        memset(usedj,0,sizeof(usedj));
        try{
            Work(1);
        }
        catch(const char* t){
            continue;
        }
    }
    return 0;
}

by Sirius6699 @ 2023-09-02 09:30:44

你看他的数据: 6≤n≤13。

实在不行也可以......


|