求助,神奇的问题
查看原帖
求助,神奇的问题
728666
ZY_85楼主2023/8/25 16:21
题目是一本通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;
}
2023/8/25 16:21
加载中...