王、后传说------蓝桥杯
问题描述
地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横、坚、斜线位置。
看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地。各皇后都有自己的势力范围,但也总能找到相安无事的办法。
所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死......
现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王在王宫的边上,占用的格子可能不到9个)。当然,皇后也不会攻击国王。
现在知道了国王的位置(x,y)(国王位于第x行第y列,x,y的起始行和列为1),请问,有多少种方案放置n个皇后,使她们不能互相攻击。
输入格式
一行,三个整数,皇宫的规模及表示国王的位置
输出格式
一个整数,表示放置n个皇后的方案数
样例输入
8 2 2
样例输出
10
数据规模和约定
n<=12
问题分析:是深度搜索的题目是通过递归+回溯求解 (先放第一个皇后(第一个不用判断位置是否不在对角线和一列只需要判断是否在王的周围),然后判断第二个(判断位置是否不在对角线和一列只需要判断是否在王的周围)如果不满足条件返回上一个让上一个皇后放下一个位置,如果满足则往下推)
详细看代码注释
个人见解欢迎交流
1 #include<stdio.h> 2 #include<math.h> 3 int n,ans;//n代表实在n x n的棋盘上,ans表示满足 使她们不能互相攻击条件 的次数 4 int a[20];// 用来表示第i行放在第几个位置,如a[5]=10 表示 第5行皇后放在第10个位置 5 int x,y;//表示王放的位置 6 int isok(int num,int i) 7 { 8 int j; 9 if(abs(num-x)<=1 && abs(i-y)<=1)//表示在不在王的周围以及王的位置 10 return 0; 11 for(j=1;j<num;j++) 12 { 13 if(abs(j-num)==abs(a[j]-i) || a[j]==i )//--1、判断对角线是非没有其他皇后--2、因为每一行只能有一个皇后所以现在只检查每一列是不是一个 14 return 0; 15 } 16 return 1; 17 } 18 void dfs(int num) 19 { 20 int i; 21 if(num>n)num//表示第num行 如果num>n,说明前n行已经都放上了皇后 22 { 23 ans++;//满足条件后 ans++; 24 return; 25 } 26 for(i=1;i<=n;i++)//i表示第num行皇后放在第i位置上 n>=i>=1 27 if(isok(num,i))//如果可以放上 执行 28 { 29 a[num]=i;// 第num行皇后放在第i位置上 30 dfs(num+1);//第num行放上后,在进行第num+1行 31 } 32 } 33 int main() 34 { 35 scanf("%d%d%d",&n,&x,&y); 36 dfs(1);//从第一行开始 37 printf("%d",ans); 38 return 0; 39 }