文章
8
粉丝
14
获赞
7
访问
631
题目要求输出第t个串,则每次递归到n=8时,令t--,当t==0时,输出path所保存的路径。从第一行开始搜索,直到搜索完8行为止。搜索完8行,且是刚好第k次搜索完8行,则将路径打印出来并返回。下一轮搜索完8行,会让t再次减一,达到-1,此时可以做一个剪支,当t小于0时直接返回。
#include<bits/stdc++.h>
using namespace std;
const int N = 8;
int path[N];//保存搜索的路径
bool col[N],dia[2*N],udia[2*N];
void dfs(int u,int &t){
if(t < 0) return; //做一个剪支
if(u == N){
t --;
}
if(t == 0 && u == 8){
for(int i = 0;i < N;i ++)
cout<<path[i];
cout<<endl;
return ;
}
for(int i = 0;i < N;i ++){
if(!col[i] && !dia[u+i] && !udia[i-u+N]){
path[u] = i+1; //保存路径,从1开始
col[i] = dia[u+i] = udia[i-u+N] = true;
dfs(u+1,t);
col[i] = dia[u+i] = udia[i-u+N] = false; //恢复现场
}
}
}
int main(){
int n;
cin>>n;
dfs(0,n);
return 0;
}
登录后发布评论
暂无评论,来抢沙发