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

    想做简单的普及-的题寻找自信,结果还丧失了自信

    p1605
    一开始满屏MLE了,然后想了想emmm大概是一开始移动的时候开了两个数组dx dy的原因,然后就改成一个数组过了

    #include<iostream>
    #include<algorithm>
    #include <vector>
    #include <map>
    typedef  long long  LL;
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<queue>
    #include<cmath>
    //交以发,满屏MLE
    using namespace std;
    int ed[14][14];
    int v[14][14];//二维数组存位置还是很常见的,之前还用pair存过点
    int m,n,nx,ny,ex,ey;
    int ans=0;
    int d[5]={-1,0,1,0,-1};
    void dfs(int x,int y){
        if(x==ex&&y==ey){
            ans++;
            return ;
        }
        for (int i = 0; i < 4; ++i) {
            int xx=x+d[i];
            int yy=y+d[i+1];
            if(xx>=1&&xx<=m&&yy>=1&&yy<=n&&!v[xx][yy]){
                v[xx][yy]=true;
                dfs(xx,yy);
                v[xx][yy]=false;//第一次忘了回溯了
            }
        }
    
    
    
    }
    int main(){
        int t,zx,zy;
        cin>>n>>m>>t>>nx>>ny>>ex>>ey;
        v[nx][ny]=true;
        while (t--){
            cin>>zx>>zy;
            v[zx][zy]=true;//所谓障碍,跟边界是一个意思
        }
        dfs(nx,ny);
        cout<<ans<<endl;
    
    }
    

    p2404
    本来不打算写这个题了,但是由于去年这个时候感觉这个题好难啊啊啊(刚学),所以今年打算找一下ac的快感
    我就闲的

    呜呜呜,一遍过了,还是有进步的(不要跟我说这题很基础我不听呜呜)

    #include <bits/stdc++.h>
    using namespace std;
    int n;
    void dfs(int sum,int now,vector<int> v){
        if(sum<0)
            return ;
        if(sum==0&&v.size()>1){
            for (int i = 0; i < v.size(); ++i) {
                cout<<v[i];
                if(i!=v.size()-1){
                    cout<<"+";
                }
    
            }
            cout<<endl;
            return ;
    
        }
        for (int i = now; i <= sum; ++i) {
            v.push_back(i);
            dfs(sum-i,i,v);
            v.pop_back();
    
        }
    
    }
    int main(){
        vector<int> v;
        cin>>n;
        dfs(n,1,v);
    }
    

    p1019

    提高-的题对我来说就不是很友好了
    参考了dl的题解呜呜
    首先预处理字符串

    #include<iostream>
    using namespace std;
    int n,dic[21][21],vis[21],ans;
    string words[21];
    char s;
    void f(string a,string b,int x,int y)
    {
        int a1=a.size()-1,b1=b.size()-1;
        for(int i=0;i<=b1;i++)  //从第一个开始枚举
        {
            if(a[0]==b[i])  //如果a的首字母和b中间的字母相同 ,则判断它们能不能接在一起
            {
                int pos=0,tot=0;  //pos是当前a的第几个字母,tot是a和b的重合部分长度
                for(int j=i;j<=b1;j++)
                {
                    if(a[pos]==b[j])
                    {
                        tot++;
                        pos++;
                        if(j==b1&&tot!=min(a1,b1)+1) //如果枚举到了最后,并且a和b没有包含关系,说明可以这么接
                            dic[x][y]=tot;  //记录最小重叠部分的长度
                        //之所以不break,是因为后面可能还会枚举到更小的
                    }
                    else break;
                }
            }
        }
    }
    void dfs(int pos,int sum)
    {
        ans=max(ans,sum);  //实时更新ans
        for(int i=1;i<=n;i++)
        {
            if(dic[i][pos]&&vis[i])//通过dig判断能不能接
            {
                vis[i]--;
                int suml=sum+words[i].size()-dic[i][pos]; //接上新单词"龙"的长度为=旧的长度+新单词长度-重复部分长度
                dfs(i,suml);  //接上新单词继续搜索
                vis[i]++;
            }
        }
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>words[i];
            vis[i]=2; //初始化vis数组,每个单词能用两次
        }
        cin>>s;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                f(words[i],words[j],i,j); //预处理dic数组
    
        for(int i=1;i<=n;i++)
        {
            if(words[i][0]==s)  //找到开始部分
            {
                vis[i]--;
                dfs(i,words[i].size()); //深搜
                vis[i]++;
            }
        }
        cout<<ans;
    
        return 0;
    }
    
    为了自己,和那些爱你的人
  • 相关阅读:
    题解 CF171G 【Mysterious numbers
    题解 P1157 【组合的输出】
    题解 P3955 【图书管理员】
    题解 P2036 【Perket】
    题解 CF837A 【Text Volume】
    题解 CF791A 【Bear and Big Brother】
    题解 CF747A 【Display Size】
    题解 P1332 【血色先锋队】
    题解 P2660 【zzc 种田】
    题解 P4470 【[BJWC2018]售票】
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/14362331.html
Copyright © 2011-2022 走看看