作业题“N皇后”

不是很能理解这道题的输出样例,为什么我的输出是这样的

1 3 5 7 2 4 
1 4 7 3 6 2 
1 5 2 6 3 7 
4

这个输出为什么和我的不一样?代码在下面

#include <bits/stdc++.h>
using namespace std;

int r [ 15 ] , c [ 15 ] , cnt , n , sum; // r:行 c:列
bool check ( int id )
{
	for ( int i = 1; i < id; i++ )
	{
		if ( r [ i ] == r [ id ] )
		{
			return 0;
		}
		if ( c [ i ] == c [ id ] )
		{
			return 0;
		}
		if ( abs ( r [ i ] - r [ id ] ) == abs ( c [ i ] - c [ id ] ) )
		{
			return 0;
		}
	}
	return 1;
}
void dfs ( int id ) // 当前在id行
{
	if ( id == n + 1 )
	{
		cnt++;
		if ( sum < 3 )
		{
			for ( int i = 0; i < n; i++ )
			{
				cout << c [ i ] + 1 << " ";
			}
			cout << "\n";
			sum++;
		}
		return;
	}
	for ( int i = 1; i <= n; i++ )
	{
		r [ id ] = id , c [ id ] = i;//摆上棋子
		if ( check ( id ) == 1 )//检查
		{
			dfs ( id + 1 );
		}
	}
}
int main()
{
	cin >> n;
	dfs ( 1 );
	cout << cnt << "\n";
	return 0;
}

普通的 “n皇后”是能过的,就是这个列数的问题

4 个赞

你这个是i=0;i<n;i++,那么上面的n+1得改成n

6 个赞

首先,是要先判断是否能摆才去摆的。所以,这里代码的顺序是:

if ( check ( id ) == 1 )//检查
		{
r [ id ] = id , c [ id ] = i;
			dfs ( id + 1 );
		}

然而,我们还是错了·····(6
难道就要放弃了吗·····

dfs的精髓是什么?

是什么??

是什么!!!

哦,我知道了!

这道题需要用到回溯算法!!

r [ id ] = 0 , c [ id ] = 0;

然而呢?还是不对。。。
萨尔朗·······皇后萨尔朗·······

对了!皇后······对角线!!!

12^2*2=288,最接近的是15,直接写:

int d[17];

但是为什么还不对········

脑海里隐隐响出一个声音:你这判断有问题啊·····

对了!只要判断是否走过就行了不需要写这么多!

visy[y]==0 && visl[y-x+n]==0 && visr[y+x-1]==0

给我——坐下!

屏幕截图 2023-05-25 195108

6 个赞