八皇后问题(害 小菜鸟我写了半天 希望各位大佬指正)
题目的来源是 洛谷的P1219 [USACO1.5]八皇后 Checker Challenge
---------------------写的博客的过程中感觉表达好难,这也是我的第一篇博客,望各位大佬见谅
对于这个题卡住我的地方主要是:如何对斜着的皇后进行判断-------害 我太菜了 搞了好久
对于这个题的思路:先不考虑皇后斜着会攻击的问题,先让他们不会处于上下或左右的相邻位置,之后,再加上一个check函数进行判断去掉位于斜线的皇后
1.对于让他们不上下或左右相邻
我开了一个布尔的flag数组用于判断每列是否已经放过了皇后,然后再递归不同的行,保证了在不同的行处放的皇后也会位于不同的列。同时由于题目要求输出前三个解,于是我就开了一个整形的b数组用于存放每一种方案的列数。具体的代码如下:

2.对于位于斜线的判断
我的思路是他每放一个皇后,我们就进行一次检查,检查这次放的皇后的斜线攻击范围内是否有其他别的皇后,如果有,则需要return,如果没有,则可以放在那里。于是我写了check函数,每放一个皇后,我都会把那个皇后的坐标传给check函数
让他进行判断,看这个刚放的皇后是否合法。(这里为了传入列数好传,于是我定义了一个全局的变量k)具体的代码如下:

于是就成功的通过啦 。
完整的代码如下:
#include<iostream>
#include<string>
using namespace std;
int n,sum,k;
int flag[15];
int b[10];
int a[15][15];
bool check(int p,int q){
int p_1 = p;
int q_1 = q;
while(p != 0 && q != 0){
p--;
q--;
if(a[p][q] == 1)
return true;
}
p = p_1;
q = q_1;
while((p != 0 && p != n+1) && (q != 0 && q != n+1)){
p--;
q++;
if(a[p][q] == 1)
return true;
}
return false;
}
void print(){
for(int i = 1;i <= n;i++)
cout<<b[i]<<" ";
}
void dfs(int m){
if(check(m-1,k))
return;
if(m == n+1){
sum++;
if(sum <= 3){
print();
cout<<endl;
}
return;}
for(int i = 1;i <= n;i++)
if(!flag[i]){
flag[i] = true;
b[m] = i;
k = i;
a[m][i] = 1;
dfs(m+1);
a[m][i] = 0;
flag[i] = false;
b[m] = 0;
}
}
int main(){
cin>>n;
dfs(1);
cout<<sum<<endl;
return 0;
}
结束结束 下一题 小灰灰加油!!!!

浙公网安备 33010602011771号