洛谷1219搜索

洛谷p1219搜索问题p1219

思路:1.用行数组存储结果。2.无法搜索就回溯,取消标记 3.边界条件是到达最大深度的下一个深度,此时可能已经找到了解
4.将对角线之和为定值或者之差为定值来对每一条对角线进行标记。

#include<stdio.h>
int cnt=1;
int ls[105],rs[105],lie[15],ans[15];//ans[i]代表第i行第ans[i]里面有棋子
int n; 
void  put(){
 int i;
 if(cnt<=3){
 
 for(i=1;i<=n;i++)
 printf("%d ",ans[i]); 
    printf("\n");
 }
 cnt++;
}
//第k行 
void dfs(int k){
    if(k>n)
    {
     put();
     return;
 }
 int i;
 for(i=1;i<=n;i++)
 {
 if(!ls[i+k] && !rs[i-k+n] && !lie[i]){       //没有标记才进行搜索 
  ans[k]=i;
  lie[i]=1;
  ls[k+i]=1;
  rs[i-k+n]=1;//标记 
  dfs(k+1);
  lie[i]=0;
  ls[k+i]=0;
  rs[i-k+n]=0; //回溯 
 }
 }
 return;
} 
int main(){
 scanf("%d",&n);
 dfs(1);
 printf("%d",cnt-1);
}

直接进行标记运用两重循环来进行:

for(int i=0;i<n;i++)
    {
        int ok=1;
        c[queen]=i;//把此行皇后放在i列
        for(int j=0;j<queen;j++)
            if(c[queen]==c[j]||queen-c[queen]==j-c[j]||queen+c[queen]==j+c[j])//检查是否冲突
            {ok=0;break;}
        if(ok) dsf(queen+1);//如果合法就继续
    }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值