蒟蒻の小窝(递归实现全排列,迷宫问题,已更新拼数问题)DFS

近期学了递归,感觉对于非尾递归不太好理解,写下来希望有神犇给本蒟蒻修改意见。
首先从全排列开始,对于一个数组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;
}
发布了20 篇原创文章 · 获赞 13 · 访问量 561

猜你喜欢

转载自blog.csdn.net/weixin_45961841/article/details/104134956