【ACM】DFS & 全排列 & 回溯

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN___CSDN/article/details/83830800

深入体会一下DFS,回溯

在一些OJ上endl和“\n”还是有区别的!!!

方法一:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1000;
int vis[maxn],a[maxn],n;
int dfs(int step)
{
	int i;
	if(step==n+1)
	{
		for(i=1;i<=n;i++)
			printf("%d ",a[i]);
		printf("\n");
	}
	else
	{
		for(i=1;i<=n;i++)
		{
			if(vis[i]==0)
			{
				vis[i]=1;
				a[step]=i;
				dfs(step+1);
				vis[i]=0;
			}
		}
	}
}
int main ()
{
	while(scanf("%d",&n)==1 && n)
	{
		dfs(1);
	}
	return 0;
}

方法二:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1000;
int vis[maxn],a[maxn],n;
void dfs(int x,int index)
{
	int i;
	a[index]=x;
	if(index==n-1)
	{
		for(i=0;i<n;i++)
		{
			printf("%d ",a[i]);
		}
		printf("\n");
		return ;
	}
	else
	{
		for(i=1;i<=n;i++)
		{
			if(vis[i]==0)
			{
				vis[i]=1;
				dfs(i,index+1);
				vis[i]=0;
			}
		}
	} 
}
int main ()
{
	int i;
	while(scanf("%d",&n)==1 && n)
	{
		memset(vis,0,sizeof(vis));
		for(i=1;i<=n;i++)
		{
			vis[i]=1;
			dfs(i,0);
			vis[i]=0;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/CSDN___CSDN/article/details/83830800