菜鸡求助,感觉思路应该没问题但是不知道为啥输出的是全排列
查看原帖
菜鸡求助,感觉思路应该没问题但是不知道为啥输出的是全排列
404660
Aurora020506楼主2020/12/2 17:52
#include <iostream>
using namespace std;
int n;
int a[15];
int total=0;
int f[15]={0};            //记录列上是否已经有棋子 或者说记录数字是否已经被使用了 
int djx1[30]={0},djx2[30]={0};              //记录对角线的重复情况 
                                            //对角线1为左上到右下,相同之处为m-i值相同,范围为1-n到n-1
											//对角线2为右上到左下,相同之处为m+i值相同,范围为2到2*n 
int judge(int m,int i)
{
	if(f[i]==0&&djx1[m-i+n]==0&&djx2[m+i]==0)
	return 1;
	else
	return 0;
} 

void dfs(int m) //行循环 
{
	if(m==n+1)
	{
		if(total<3)
		{
			for(int i=1;i<=n;i++) cout << a[i] << ' ';
		    cout << endl;
		}
		total++;
	}
	else
	{
		for(int i=1;i<=n;i++)   //列循环 
		{
			if(judge(m,i))
			{
				a[m]=i;
				f[i]=1;
				djx1[m-i+n]==1;
				djx2[m+i]==1;
				dfs(m+1);
				f[i]=0;
				djx1[m-i+n]==0;
				djx2[m+i]==0;
			}
		}
	}
}

int main()
{
	cin >> n;
	dfs(1);   //dfs的形参的含义是待填写的数的行 位置 
	cout << total;
	return 0; 
} 
2020/12/2 17:52
加载中...