最后一个点超时了 改怎么优化啊
查看原帖
最后一个点超时了 改怎么优化啊
489379
沐雪楼主2021/7/28 10:28

复杂度为N*N!

n=13的时候跑不过了。。

哪里可以优化下啊

#include<bits/stdc++.h>
using namespace std;
int col[15];
int n;
long long tot;
bool check(int c,int r){      //检查冲突 
	for(int i=0;i<r;i++){
		if(col[i]==c||(abs(col[i]-c)==abs(i-r))) return 0;
	}
	return 1;
}
void dfs(int r){         //一行行放皇后 
	if(r==n){
		tot++;
		if(tot<4){
			for(int i=0;i<n;i++) printf("%d ",col[i]+1);
			printf("\n");
		}
		return;
	}
	for(int c=0;c<n;c++){    //在每一列放皇后 
		if(check(c,r)){      //检查是否合法 
			col[r]=c;
			dfs(r+1);       //继续下一行 
		}
	}
}
int main(void){
	scanf("%d",&n);
/*	if(n==13){
		printf("1 3 5 2 9 12 10 13 4 6 8 11 7\n1 3 5 7 9 11 13 2 4 6 8 10 12\n1 3 5 7 12 10 13 6 4 2 8 11 9\n73712");
		return 0;
	}*/
	dfs(0);
	printf("%lld",tot);
	return 0;
}
2021/7/28 10:28
加载中...