P1219 [USACO1.5]八皇后 Checker Challenge(C语言)

10 篇文章 9 订阅

P1219 [USACO1.5]八皇后 Checker Challenge

在这里插入图片描述
在这里插入图片描述

1.思路

1.1对角线的表示

首先根据题目的要求,我们可以用一个数组line[13]表示皇后放置的位置 如line[4]=5 则表示第4行第5列放了一个皇后。然后再分别用ud[13],ld[13]表示上,下对角线
看上对角线的图,不难发现处于上对角线的值都是相等的则可以用ud[i+j]来表示,其中i表示第几行,j表示第几列。
可能还有一点很难理解,为什么ud[i-j]能表示一条对角线,不就是一个单独的坐标吗
其实很容易想明白了,i 可能代表不同的行,因而j代表的列也会随之改变,所以就表示了一条对角线。

在这里插入图片描述
说完上对角线,下对角线应该也很容易理解吧!
可以表示为ld[i+j]
在这里插入图片描述

1.2DFS

说到这里,基本到了最核心的地方。就是标记和回溯

void dfs(int i){//i表示第几行
    if(i>n)  { print();return;}
    else       { 
    
    for(int j=1;j<=n;j++){
        if( !row[j] && !ud[i+j] && !ld[i-j+n] ){//列,上,下对角线没有标记,则可以放皇后
            line[i]=j; //第i行第j列放了第i个皇后
            row[j]=1;//标记
            ud[i+j]=1;
            ld[i-j+n]=1;
            dfs(i+1);            
            row[j]=0;//回溯
            ud[i+j]=0;
            ld[i-j+n]=0;           
        		}
  			 }
		}
	}

1.3打印

void print(){
    sum++;
    if(sum<=100){
        for(int i=1;i<=n;i++)
            printf("%d",line[i]);
         printf("\n");
    }
    else
    return ;
      
}

2.源码

#include<stdio.h>
int n;
int line[13],row[13],ud[100],ld[100];
int sum;
int j;
void print(){
    sum++;
    if(sum<=100){
        for(int i=1;i<=n;i++)
            printf("%d",line[i]);
         printf("\n");
    }
    else
    return ;
      
}

void dfs(int i){//i表示第几行
    if(i>n)  { print();return;}
    else       { 
    
    for(int j=1;j<=n;j++){
        if( !row[j] && !ud[i+j] && !ld[i-j+n] ){
            line[i]=j;
            row[j]=1;
            ud[i+j]=1;
            ld[i-j+n]=1;
            dfs(i+1);
            
            row[j]=0;
            ud[i+j]=0;
            ld[i-j+n]=0;           
        		}
  			 }
		}
	}

int main(){
    scanf("%d",&n);
    dfs(1);  //从第一行开始,放皇后
    printf("%d",sum);
    
}
  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ღ江晚吟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值