近期学了递归,感觉对于非尾递归不太好理解,写下来希望有神犇给本蒟蒻修改意见。
首先从全排列开始,对于一个数组a[n],就以a[5]={1,2,3,4,5}为例,除了next_permutation函数外还可以通过深搜(递归)实现全排列。
#include<bits/stdc++.h>
using namespace std;
void fpx(int *a,int b,int n)
{
int i;
if(n==1)
{
for(i=0;i<b;i++)
cout<<a[i]<<" ";
cout<<endl;
}
else
{
for(i=0;i<n;i++)
{
swap(a[i],a[n-1]);
fpx(a,b,n-1);
swap(a[i],a[n-1]);//结束后,保持数组原状
}
}
}
int main()
{
int a[5]={1,2,3,4,5};
void fpx(int *a,int b,int n);
fpx(a,5,5);
}
再看迷宫问题:
采用递归算法实现迷宫问题,并输出所有路径。
这个函数包含五个参数,起始坐标 x,y,终点坐标xi,yi,路径path。
递归出口为xxi,yyi
如果到了递归出口,输出所有路径,如果没有,则可从当前坐标(x,y)通过分别上下左右四个方向+1-1来实现移动(switch)
path采用结构体,存放x,y。
#include<bits/stdc++.h>
using namespace std;
int mg[6][6]=
{
{1,1,1,1,1,1},
{1,0,0,0,1,1},
{1,0,1,0,0,1},
{1,0,0,0,1,1},
{1,1,0,0,0,1},
{1,1,1,1,1,1}
};
typedef struct ss
{
int xu;
int yu;
}stu;//定义坐标
typedef struct ww
{
stu data[6*6]; //size为迷宫方格总数,防止MLE
int length;//迷宫长度
}
pathss;
void migong(int x,int y,int xi,int yi,pathss path)
{
int d,k,i,j,w;
if(x==xi&&y==yi)
{ path.data[path.length].xu =x;
path.data[path.length].yu =y;
path.length ++;
cout<<"迷宫路径";
for(k=0;k<path.length;k++)
{
cout<<path.data[k].xu<<','<<path.data[k].yu;
}
cout<<endl;
}
else
{
if(mg[x][y]==0)
{
d=0;
while(d<4)
{
switch(d)
{
case 0:i=x+1,j=y;break;
case 1:i=x-1,j=y;break;
case 2:i=x;j=y+1;break;
case 3:i=x;j=y-1;break;
}
}
path.data[path.length].xu=x;
path.data[path.length].yu=y;
path.length ++;
mg[x][y]=-1;//标记,等到小问题解决前不重复访问
}
migong(i,j,xi,yi,path);
path.length--; //回溯
mg[x][y]==0;
d++;//尝试不同走法
}
}
int main()
{
void migong(int x,int y,int xi,int yi,pathss path);
pathss path;
path.length=0;
migong(1,1,4,4,path);
}
插一个洛谷p1012的DFS实现(当然首推next_permutation
#include<bits/stdc++.h>
using namespace std;
string a[21];
int b[21];
string c[21];
long long sum = 0;
int n;
void dfs(int x)
{
if (x == n+1)
{
long long t;
string w="";
for (int i = 1; i <= n; i++)
w += c[i];
stringstream p;//字符串转long long
p << w;
p >> t;
if (t > sum)
sum = t;
return;
}
for (int i = 1; i <=n; i++)
{
if (!b[i])
{
c[x]= a[i];
b[i] = 1;
dfs(x+1);
b[i] = 0;
}
}
return ;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
dfs(1);
cout << sum;
}