题目的来源是 洛谷的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; }
结束结束 下一题 小灰灰加油!!!!
标签:return,int,菜鸟,--,指正,&&,皇后,大佬,check From: https://www.cnblogs.com/fighting-huihui/p/17021837.html