zoukankan      html  css  js  c++  java
  • luogu搜索刷题

    话说今天本来想学一下dfs的剪枝技巧的
    结果感觉啊啊啊啊这都些什么玩意还是回归最质朴的dfsbfs吧

    • 注意传参问题,,,
      - 如果你在函数的参数里写了一些参数,可以节省空间。
      - 比如,第二题选数,你可能要开一个vector记录选出来的数,但实际上你只需要在参数里加一个sum,每次更新sum+a[i]就行了
    • 注意是否可以重复选
      - 先看有没有重复的数字,,,这些数字可不可以重复选(因为有的数字不可以重复选但会重复出现,这个时候需要sort(下面那个题也有)
      - 就是说,数字可以重复选择的参数和不能重复选择的参数不同,i检索的开始也不同。如果是跑图的话,可能就需要一个visited数组
      - 之前leet上面有这么一个东西 在这里

    p1443

    看出clion强大的时候到了
    这个pair嵌套的时候,就比如map <pair<int,int>> 右边这个双箭头得跟右移符号区分,,,加个空格map <pair<int,int> >

    luogu的测评机那么强还是给我编译不过了,,,俺clion都没有理会这小错误,,,warning都没有

    当然为了保险起见,还是建议用大多数编译器都能过的方式吧

    还有个wa就是一开始没看到左对齐宽五格QAQ

    //
    // Created by Arc on 2021/2/1
    //做简单题以寻找自信
    //
    #include <iostream>
    #include <queue>
    #include "stdio.h"
    #include <algorithm>
    #include <string>
    #include <cstring>
    
    using namespace std;
    const int dx[8]={-1,-2,-2,-1,1,2,2,1};
    const int dy[8]={2,1,-1,-2,2,1,-1,-2};//8个方向
    queue<pair<int,int> > q;
    int f[501][501];//存需要几步才能达到
    int visited[501][501];
    int m,n;
    bool check(int x,int y){
        if(x>0&&x<=m&&y>0&&y<=n&&!visited[x][y])
            return true;
        return false;
    }
    int main(){
        memset(f,-1,sizeof(f));
        memset(visited,0,sizeof(visited));
    
        cin>>m>>n;
        int i,j;
        cin>>i>>j;
        visited[i][j]=1;
        f[i][j]=0;
    
        q.push(make_pair(i,j));
        while(!q.empty()){
            int a=q.front().first;
            int b=q.front().second;
            //cout<<"a:"<<a<<"b:"<<b<<endl;
            q.pop();
            for (int k = 0; k < 8; ++k) {
                int xx=a+dx[k];
                int yy=b+dy[k];
                if(check(xx,yy)){
                    //cout<<xx<<" "<<yy<<endl;
                    visited[xx][yy]=1;
                    q.push(make_pair(xx,yy));
                    f[xx][yy]=f[a][b]+1;
                }
    
            }
        }
        for (int k = 1; k <= m; ++k) {
            for (int l = 1; l <= n; ++l) {
                printf("%-5d",f[k][l]);
            }
            cout<<endl;
        }
    
    }
    
    
    

    p1036
    这个题需要注意上面说的,传参问题

    一开始写的可能出现重复的组合(比如 1 2 3和3 2 1这种)可以通过设置参数去掉

    //
    // Created by Arc on 2021/2/2
    //继续做简单题以寻找自信
    //
    #include <iostream>
    #include <queue>
    #include "stdio.h"
    #include <algorithm>
    #include <string>
    #include <cstring>
    #include <math.h>
    
    using namespace std;
    int n,k;
    int a[100];
    int ans=0;
    vector<int> num;
    int v[100];
    bool is_prime(int k){
        for (int i = 2; i < sqrt(k); ++i) {
            if(!(k%i))
                return false;
    
        }
        return true;
    }
    void f(int sum,int start,int all){
       // cout<<"sum:"<<sum<<endl;
        if(sum==k){
            if(is_prime(all)){
    
                ans++;
    
            }
    
        }
        for (int i = start; i < n; ++i) {
                f(sum+1,i+1,all+a[i]);
        }
    
    }
    
    int main(){
        //memset(v,0,sizeof(v));
        cin>>n>>k;
        for (int i = 0; i < n; ++i) {
            cin>>a[i];
        }
        f(0,0,0);
        cout<<ans<<endl;
    
    }
    
    
    为了自己,和那些爱你的人
  • 相关阅读:
    用 ArcMap 发布 ArcGIS Server Feature Server Feature Access 服务 SQL Server版
    ArcGIS Server Manager 重置密码
    接口自动化过程中遇到的问题?
    接口自动化的闭环?
    每天有80亿的文件需要存储,你会怎么设计存储和检索?
    数据库之索引
    java之高并发锁
    测试环境搭建
    shell基本语法
    RPC和HTTP
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/14359132.html
Copyright © 2011-2022 走看看