蓝桥杯每日一题(dfs)

3502 不同路径数

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

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

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

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

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

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

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

#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的值。递归返回的时候会出错。

#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,避免越界

#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本来就是有暴力的意思在里面的,求出所有的组合划分边界(注意边界的选择问题)

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

#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拖了好几天,写完了

相关推荐

  1. 每日dfs

    2024-03-22 05:40:02       19 阅读
  2. 2024每日(区间DP

    2024-03-22 05:40:02       14 阅读
  3. 每日(python)

    2024-03-22 05:40:02       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-22 05:40:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-22 05:40:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-22 05:40:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-22 05:40:02       18 阅读

热门阅读

  1. 数学建模常用的代码

    2024-03-22 05:40:02       17 阅读
  2. MQ组件之RabbitMQ学习

    2024-03-22 05:40:02       20 阅读
  3. 【oss】阿里云oss服务器模拟

    2024-03-22 05:40:02       18 阅读
  4. uniapp中预览base64图片

    2024-03-22 05:40:02       16 阅读
  5. 数据分析-Pandas数据分类的转换控制

    2024-03-22 05:40:02       23 阅读
  6. 信号量实现生产者消费者程序_C语言示例

    2024-03-22 05:40:02       19 阅读
  7. 获取kafka中topic偏移量和消费偏移量

    2024-03-22 05:40:02       18 阅读
  8. P1118 [USACO06FEB] Backward Digit Sums G/S

    2024-03-22 05:40:02       17 阅读
  9. ARM day6

    2024-03-22 05:40:02       17 阅读
  10. spring cloud gateway k8s优雅启停

    2024-03-22 05:40:02       17 阅读
  11. Flink:Lookup Join 实现与示例代码

    2024-03-22 05:40:02       18 阅读
  12. 深度学习Top10算法之ResNet

    2024-03-22 05:40:02       16 阅读