大佬们求助40分
查看原帖
大佬们求助40分
1106289
KomorKomor楼主2024/3/26 21:29
//KomorGiaoGiao
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <climits>
#include <vector>
#include <stack>
#include <cstring>
#include <map>
#include <cmath>
#include <queue>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define N 1010
#define ll long long 
#define mx INT_MAX
using namespace std;

int n;
struct moxi
{
	string s;
}ans[100010];
//储存答案
int solutions=0;
int queen[20];//储存第i行的皇后在的列数
int dui1[20],dui2[20];//储存两条对角线
int lie[20];

void dfs(int row)//排数
{
	if(row==n)
	{
		for(int i=0;i<n;i++)
        {	
            ans[solutions].s+=queen[i]+1+'0';
            ans[solutions].s+=" ";
            }
		solutions++;
		return ;
	}
	for(int col=0;col<n;col++)//循环列数
	{
		if(!lie[col]&&!dui1[col+row]&&!dui2[n+row-col])//如果这个地方能放棋子
		{
			queen[row]=col;//标志着这一行被占领
			int a=row+col,b=n+row-col;
			lie[col]=1,dui1[a]=1,dui2[b]=1;
			dfs(row+1);
			lie[col]=0,dui1[a]=0,dui2[b]=0;
		}
	}
}
bool cmp(moxi a,moxi b)
{
	return a.s<b.s;
}
//用于按照字典序输出
int main()
{
	IOS
	int t=1;
	//cin>>t;
	while(t--)
	{
		cin>>n;
		dfs(0);
		sort(ans,ans+solutions,cmp);
		for(int i=0;i<min(3,solutions);i++)
			cout<<ans[i].s<<endl;
        cout<<solutions<<endl;
	}
	return 0;
}

大佬们求调

2024/3/26 21:29
加载中...