深入体会一下DFS,回溯
在一些OJ上endl和“\n”还是有区别的!!!
题目链接:http://codevs.cn/problem/1294/
方法一:
#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;
}