蓝桥杯每日一题(dfs)

3502 不同路径数

1、要注意以每个点为起点都要dfs

2、自己用1-n 1-m存数不知道为什么报错

3、自己写的时候参数写对了 层数,来源的位置,前面累计的数

4、边界:0-k-1实现了k次,到k的时候,直接将res加入set

5、否则则遍历4种可能,

6、自己写的时候没有想清楚,边界应该怎样处理,因为每次都是res加完之后找下一层

所以到了最后一层的时候其实前面已经结束了。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
//3502 不同路径数
const int N=5;
int a[N][N];
int n,m,k;
unordered_set<int>mp;
int s[4]={0,1,0,-1},z[4]={1,0,-1,0};
void dfs(int u,int x,int y,int res)
{
    if(u==k)
    {
        mp.insert(res);
    }
    else
    {
        for(int i=0;i<4;i++)
        {
            int xx=x+s[i];
            int yy=y+z[i];
            if(xx>=0&&xx<n&&yy>=0&&yy<m)
            {
               dfs(u+1,xx,yy,res*10+a[xx][yy]);

            }
        }
    }
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>a[i][j];
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            dfs(0,i,j,a[i][j]);
        }
    }
    cout<<mp.size()<<endl;
}

842排列数组

求数字的全排列;

在一个地方:cnt,在递归调用的时候是dfs(cnt+1),而不是cnt++。也就是不能在这一层修改cnt的值。递归返回的时候会出错。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
//842 排列数字
const int N=7;
int mp[N];
int ans[N];
int n;
void dfs(int cnt)
{
    if(cnt==n)
    {
        for(int i=0;i<n;i++)
        {
            cout<<ans[i]<<" ";
        }
        cout<<endl;
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(!mp[i])//还没被用到
        {
            mp[i]=1;
            ans[cnt]=i;
           //这一层的cnt不能变
            dfs(cnt+1);
            mp[i]=0;
        }
    }
}
int main()
{
    cin>>n;
    dfs(0);
}

//n皇后问题

两年前打死不会的n皇后问题也可以自己ac啦。

一定要注意主副对角线的数组大小是2N,避免越界

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
//843 n皇后问题
const int N=10;
int p[N][N];//用于保存结果
int n;
int zhu[2*N],fu[2*N],col[N];
void dfs(int x)//参数为行数
{
    if(x==(n+1))
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(p[i][j])
                {
                    cout<<"Q";
                }
                else{
                    cout<<".";
                }
               // if(j!=n)cout<<" ";
            }
            puts("");
        }
         puts("");
         return;
    }
    for(int i=1;i<=n;i++)//遍历所有列
    {
        if(!zhu[x-i+n]&&!fu[x+i]&&!col[i])
            {
                zhu[x-i+n]=1;
                fu[x+i]=1;
                col[i]=1;
                p[x][i]=1;
                dfs(x+1);
                p[x][i]=0;
                zhu[x-i+n]=0;
                fu[x+i]=0;
                col[i]=0;
            }
    }
}
int main()
{
    cin>>n;
    dfs(1);
    return 0;
}

1209带分数

一开始是有点思路,没认真写就看题解了。

dfs本来就是有暴力的意思在里面的,求出所有的组合划分边界(注意边界的选择问题)

还有一个技巧:判断某个除法的结果是否等于某个数的时候,可以两边乘以除数。化成乘法的形式。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
//1209带分数
int a[10];
int n;
int st[10];
int cnt=0;
int cal(int x,int u)
{
    int res=0;
    for(int i=x;i<=u;i++)
    {
        res=(res*10+a[i]);
    }
    return res;
}

void dfs(int ct)
{
    if(ct==9)//得到了某个全排列
    {
        //用ij分开排列(0,i)(i+1,j) (j+1,8)
        //分析可知i最大为6,j最大为7
        for(int i=0;i<7;i++)
        {
            for(int j=i+1;j<8;j++)
            {
                int a=cal(0,i);
                int b=cal(i+1,j);
                int c=cal(j+1,8);
                //int ans=a+b/c;为了避免除法
                if(a*c+b==n*c)cnt++;
            }
        }
    }
    else
    {
       for(int i=1;i<=9;i++)
       {
           if(!st[i])
           {
               st[i]=1;
               a[ct]=i;
               dfs(ct+1);
               st[i]=0;
           }
       }
    }
}

int main()
{
  cin>>n;
  dfs(0);
  cout<<cnt<<endl;
}

每日一题dfs拖了好几天,写完了

相关推荐
森焱森37 分钟前
APM与ChibiOS系统
c语言·单片机·算法·架构·无人机
★Orange★1 小时前
Linux Kernel kfifo 实现和巧妙设计
linux·运维·算法
尘世闲鱼1 小时前
解数独(C++版本)
开发语言·c++·算法·解数独
qqxhb1 小时前
零基础数据结构与算法——第四章:基础算法-排序(中)
数据结构·算法·排序算法·归并·快排·堆排
Thomas_YXQ2 小时前
Unity3D游戏内存优化指南
游戏·unity·职场和发展·性能优化·蓝桥杯·游戏引擎·unity3d
Y1nhl2 小时前
力扣_链表_python版本
开发语言·python·算法·leetcode·链表·职场和发展
qq_401700413 小时前
C语言中位运算以及获取低8位和高8位、高低位合并
c语言·开发语言·算法
CoovallyAIHub3 小时前
YOLO模型优化全攻略:从“准”到“快”,全靠这些招!
深度学习·算法·计算机视觉
闻缺陷则喜何志丹3 小时前
【BFS】 P10864 [HBCPC2024] Genshin Impact Startup Forbidden II|普及+
c++·算法·宽度优先·洛谷
MicroTech20253 小时前
微算法科技(NASDAQ: MLGO)探索Grover量子搜索算法,利用量子叠加和干涉原理,实现在无序数据库中快速定位目标信息的效果。
数据库·科技·算法