萌新求助,运用深度优先搜索,但最后三个前两个为红块,最后一个T了,求优化建议!
查看原帖
萌新求助,运用深度优先搜索,但最后三个前两个为红块,最后一个T了,求优化建议!
395887
jinhai楼主2020/10/22 00:17
#include<bits/stdc++.h>
#include<stack>
using namespace std;
int n,c,num=0;
int a[10];
stack <int>stk;
int ed[20][20]={0};
void panduan(int d,int b)
{
	c=1;
	for(int j=1;j<=n;j++)
	{
		if(ed[d][j]==1)   c=0;
		else if(ed[j][b]==1)   c=0;
		else if(ed[d+j][b+j]==1)   c=0;
		if(b>j)
		{
			if(ed[d+j][b-j]==1)   c=0;
	 	}
		if(d>j) 
		{
			if(ed[d-j][b+j]==1)   c=0;
		}
		if(d>j&&b>j)
		{
			if(ed[d-j][b-j]==1)   c=0;
		}
		if(c==0)break;
	}
	return ;
}

void chuzhan()                            //把栈里存的数都给输出出来
{
	while(!stk.empty())
	{
		for(int i=1;i<=n;i++)
		{
			a[i]=stk.top();
			stk.pop();
		}
		
	}
	for(int i=1;i<=n;i++)                //倒叙出栈 
	{
		cout<<a[n-i+1]<<" ";
		stk.push(a[n-i+1]);
	}
	cout<<endl;
}


void huanghou(int d,int b)               //运用递归,把下一个数给找到
{
	panduan(d,b);
	if(c==1)
	{
		ed[d][b]=1;
		stk.push(b);
		if (stk.size()==n){
			num++;
			if (num<=3) chuzhan();
			ed[d][b]=0;
			stk.pop();
			return ;
		}
		for(int i=1;i<=n;i++)
		{
			huanghou(d+1,i);             //从这里跳出来,会继续往下进行
		}
		ed[d][b]=0;
		stk.pop();
	}
	return ;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		huanghou(1,i);
	}
	printf("%d",num);
	return 0;
}
2020/10/22 00:17
加载中...