20200810刷题宝藏(DFS 小猫爬山,字节0809笔试工厂零件问题,soduko数独问题)

这篇博客介绍了利用深度优先搜索(DFS)解决三道题目:小猫爬山问题,讨论了在处理数据时的注意事项;工厂零件问题,是2020年8月9日字节跳动笔试的一道题目;以及数独问题,分享了如何应用DFS进行求解,并引用了相关参考文献。
摘要由CSDN通过智能技术生成

1.小猫爬山

https://ac.nowcoder.com/acm/problem/51012

注意1:切记 在定义的data vector固定了大小的情况下一定要谨慎使用sort函数 因为有许多没有数据的0值 所以容易出错

注意2.切记在cin>>data【i】的时候一定要定义data的大小

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N,W;
vector<int>cat(20);
int minc=20;
int gract[20];

void dfs(int t,int cur){
    if(cur>=minc){return;}
    if(t>N){
        minc=min(minc,cur);
        return;
    }
    for(int i=1;i<=cur;i++){
        if(gract[i]+cat[t]<=W){
            gract[i]+=cat[t];
            dfs(t+1,cur);
            gract[i]-=cat[t];
        }
    }
    gract[cur+1]=cat[t];
    dfs(t+1,cur+1);
    gract[cur+1]=0;
}

int main(){
    cin>>N>>W;
    for(int i=1;i<=N;i++){
        cin>>cat[i];
    }
    dfs(1,1);
    cout<<minc<<endl;
    return 0;
}

小猫上车问题 如果以小猫考虑船 很难想 因为你不知道有多少船 也不知道每只猫上那条船
但是用船来考虑就好办 因为第一只猫,第二只猫都要上某条船 猫数t增加 来循环找船上 即可
如果循环到第t只猫的时候一遍下来都没有船装得下 那么就增加一条船 并且把这只猫放上去 因为前面的都放不下的话 这只猫一定要上新加的船
注意3:对于抓着每一只猫选船的时候 选起之后dfs下一只猫 但是后面要注意一定把这只猫取下来(因为这只猫不一定只可以上这条船 所以一定注意还原现场,在进行下一次循环)

2.工厂零件问题
20200809字节跳动笔试题4题
自己写的

#include<iostream>
#include<vector>

using namespace std;
int N;
int P;
vector<int>factory(100000);
vector<int>product(100000);
int count=0;

void dfs(int t,int st,int &count){

    if(t>N){
        count++;
        return ;
    }
    for(int i=st;i<=N;i++){
        if(factory[i]>=product[t]){
            dfs(t+1,i+1,count);
        }
    }
    return;
}
int main(){
    cin>>N;
    int temp;
    for(int i=1;i<=N;i++){
        cin>>factory[i];
    }
    for(int i=1;i<=N;i++){
        cin>>product[i];
    }
    cin>>P;
    dfs(1,1,count);
    cout<<count<<endl;
    return 0;
}

3.soduko 数独

https://ac.nowcoder.com/acm/contest/1014/B

#include<iostream>
#include<vector>
using namespace std;
char data[9][9];
bool flag=false;
void inputdata(string s){
    int cur=0;
    for(int row=0;row<9;row++){
        for(int col=0;col<9;col++){
            data[row][col]=s[cur++];
        }
    }
}
void outputdata(){
    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            cout<<data[i][j];
        }
    }
    cout<<endl;
    flag=false;
}
bool check(int n,char value){
    for(int i=0;i<9;i++){
        if(data[i][n%9]==value){
            return false;
        }
    }
   for(int j=0;j<9;j++){
        if(data[n/9][j]==value){
            return false;
        }
    }
    int x=n/9/3*3;
    int y=n%9/3*3;
    for(int i=x;i<x+3;i++){
        for(int j=y;j<y+3;j++){
            if(data[i][j]==value){
                return false;
            }
        }
    }
    return true;
}
bool dfs(int n){
    if(n>80){
        return true;
    }
    if(data[n/9][n%9]!='.'){dfs(n+1);}
    else{
    for(char i='1';i<='9';i++){
        if(check(n,i)){
            data[n/9][n%9]=i;
            dfs(n+1);
           if(flag==true){return true;}
            data[n/9][n%9]='.';
        }
    }
        }
}
int main(){
    string s;
    while(cin>>s){
        if(s=="end"){return 0;;}
        inputdata(s);
        if(dfs(0)){outputdata();}
        
        
    }
    return 0;
}

对于dfs函数 需要层层返回

 for(char i='1';i<='9';i++){
        if(check(n,i)){
            data[n/9][n%9]=i;
            dfs(n+1);
           if(flag==true){return true;}
            data[n/9][n%9]='.';
        }
    }

参考文献
https://www.cnblogs.com/dancer16/p/6916795.html
这个里面的dfs为int型 只有成功才返回return0 层层返回0 这样 main函数的下一行output才可以执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值