数字游戏(蓝桥杯算法训练)(C/C++)

 看到全排列,说明这是一道典型的DFS题目

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

int a[10]={1,2,3,4,5,6,7,8,9,10};
int sum;
bool vis[10];//表明数字是否用过 
int N;//全排列个数 
int b[10];//全排列后的序列 (主要是用来备份) 
int c[10];//进行计算的序列 
void dfs(int s)
{
	if(s==N)//DFS确定边界 
	{
		for(int i=0;i<N;i++)
		{
			c[i]=b[i];//备份 
		}
		int cnt=0;
		while(cnt<N)//注意循环次数 
		{
			for(int i=0;i<N-1-cnt;i++)
			{
				c[i]=c[i]+c[i+1];
			}
			cnt++;
		}
		if(c[0]==sum)
		{
			for(int i=0;i<N;i++)
			{
				cout<<b[i]<<" ";
			}
			exit(0);
		}
		return;
	}
	for(int i=0;i<N;i++)//主干 
	{
		if(!vis[i])
		{
			vis[i]=true;
			b[s]=a[i];
			dfs(s+1);
			vis[i]=false;
		} 
	}
	return; 
}

int main()
{
	cin>>N>>sum;
	dfs(0);
	cout<<"\n";
	return 0;
}

 这里需要特别说明,这里DFS的全排列其实就是按照字典序排列,所以说得出了一个解之后就没有必要继续算了,直接退出即可

猜你喜欢

转载自blog.csdn.net/m0_71934846/article/details/128456093