大佬们求助,就是运行不出来,不知道哪错了
查看原帖
大佬们求助,就是运行不出来,不知道哪错了
1106289
KomorKomor楼主2024/3/25 20:38
//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;

struct moxi
{
	string s;
}ans[20];
int n;
int mapp[20][20];//标记地图上能不能放棋子的
int inndex;

bool cmp(moxi a,moxi b)
{
	return a.s<b.s;
}//用于按字典序输出的

//怎么解决这个问题呢
//按照题意
//每行每列只能有一个棋子
//搜索的时候标记好这个棋子的位置
//那怎么解决对角线的问题
//坐标(x,y),选x和y中大的那一个
//然后(x+k,y+k)的坐标上都不能有棋子
//其中k的取值是n-max(x,y)

void dfs(int y,int dep)
{
	if(dep==n)//当深度和棋盘长度一样
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(mapp[i][j]==1)	ans[inndex].s+=to_string(j+1)+" ";
			}
		}
		inndex++;
		return ;
	}
	for(int i=1;i<=n;i++)
	{
		if(mapp[i][y]==0)
		{
			//给当前点的横纵对角线打上标记
			for(int j=1;j<=n;j++)	mapp[i][j]=1;//这一排都不能放棋子
			for(int j=1;j<=n;j++)	mapp[j][y]=1;//这一列都不能放棋子
			int k=n-max(i,y);
			for(int j=1;j<=k;j++)	mapp[i+j][k+j]=1;//处理对角线
			for(int j=1;j<=k;j++)	mapp[i-j][k+j]=1;
			dfs(y+1,dep+1);
			for(int j=1;j<=n;j++)	mapp[i][j]=0;//回溯
			for(int j=1;j<=n;j++)	mapp[j][y]=0;
			for(int j=1;j<=k;j++)	mapp[i+j][k+j]=0;
			for(int j=1;j<=k;j++)	mapp[i-j][k+j]=0;
		}
	}
}

int main()
{
	IOS
	int t=1;
	//cin>>t;
	while(t--)
	{
		cin>>n;
		dfs(1,0);
		sort(ans,ans+inndex,cmp);
		for(int i=0;i<min(3,inndex);i++)
			cout<<ans[i].s<<endl;
		cout<<inndex<<endl;
	}
	return 0;
}

2024/3/25 20:38
加载中...