首页 > 其他分享 >八皇后问题(害 小菜鸟我写了半天 希望各位大佬指正)

八皇后问题(害 小菜鸟我写了半天 希望各位大佬指正)

时间:2023-01-03 13:44:21浏览次数:36  
标签:return int 菜鸟 -- 指正 && 皇后 大佬 check

题目的来源是 洛谷的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

相关文章