• 【洛谷】搜索专题


    前言

      我搜索超级辣鸡的qaq,都是胡乱搜,各种回溯...

      有的时候都能多会回一遍,减成负的(蠢死了)

    1.P1019 单词接龙

    直通

    思路_(:з」∠)_

      爆搜。。。不想说话。。。

    坑点o_O

      ①我回溯写错了qaq

      ②改变的长度求成了一共的长度,加多了qaq

    代码酱=u=

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int N = 20; 
    int n,ans,s; //n<=20
    string a,b;
    char op;
    struct words {
        int first,last,len,c;
        string v;
        void emm() { c=0; }
        bool operator < (const words &qwq ) const {
            return len > qwq.len;
        }
    }w[N];
    
    int check(int i,int j) {
        a=w[i].v,b=w[j].v;
        int lena=w[i].len,lenb=w[j].len;
        int u=lena-1,ret=-1;
        while(u>=0) {
            if(a[u]==b[0]) {
                bool flag=true;
                int p,q;
                for(p=u,q=0; p<lena; p++,q++)
                    if(a[p]!=b[q]) {
                        flag=false;
                        break;
                    }
                if(p==lena && flag && lenb+u-lena>ret) ret=lenb+u-lena;
            }
            u--;
        }
        return ret;
    }
    
    void dfs(int nowlen,int li) {
        if(nowlen>ans) ans=nowlen;
        w[li].c++;
        for(int i=0,j; i<n; i++) {
            if(w[i].c>=2) continue; 
            j=check(li,i);
            if(j!=-1 && j!=0) {
                dfs(nowlen+j,i);
                w[i].c--;
            }
        }
    }
    
    void mem() {
        for(int i=0; i<n; i++) w[i].emm();
    }
    
    int main() {
        scanf("%d",&n);
        for(int i=0,lena; i<n; i++) {
            cin>>a;
            lena=a.length();
            w[i].v=a;
            w[i].len=lena;
            lena--;
            w[i].first=a[0]-'a';
        }
        sort(w,w+n);
        cin>>op;
        s=op-'a';
        for(int i=0; i<n; i++)
            if(w[i].first==s) {
                mem();
                dfs(w[i].len,i);
            }
        printf("%d",ans);
        return 0;
    } 
    View Code

    2.P1162 填涂颜色

    直通

    思路(〃'▽'〃)

      围一圈0,然后从(0,0)开始进行bfs或者是dfs

    代码酱٩(๑❛ᴗ❛๑)۶

    #include <iostream>
    #include <cstdio>
    #include <queue>
    using namespace std;
    
    int n;
    int map[33][33];
    int dx[4] = {0, 0,1,-1},
        dy[4] = {1,-1,0, 0};
    
    struct g {
        int x,y;
    } u,v;
    void bfs(int lx,int ly) {
        queue<g>q;
        u.x=lx,u.y=ly;
        map[lx][ly]=3;
        q.push(u);
        while(!q.empty()) {
            u=q.front();
            q.pop();
            int x=u.x,y=u.y;
            for(int i=0,xx,yy; i<4; i++) {
                xx=x+dx[i],yy=y+dy[i];
                if(xx<0 || xx>n+1 || yy<0 || yy>n+1 || map[xx][yy]==3) continue;
                if(map[xx][yy]==0) {
                    map[xx][yy]=3;
                    v.x=xx,v.y=yy;
                    q.push(v);
                }
            }
        }
    }
    
    void dfs(int x,int y) {
        for(int i=0; i<4; i++) {
            int xx=x+dx[i],yy=y+dy[i];
            if(xx<0 || xx>n+1 || yy<0 || yy>n+1 || map[xx][yy]==3) continue;
            if(map[xx][yy]==0) {
                map[xx][yy]=3;
                dfs(xx,yy);
            }
        }
    }
    
    int main() {
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                scanf("%d",&map[i][j]);
        for(int i=0; i<=n+1; i++) //手动围一圈0
            map[i][0]=map[0][i]=map[n+1][i]=map[i][n+1]=0;
        bfs(0,0);
    //    dfs(0,0);
        for(int i=1; i<=n; i++) {
            for(int j=1; j<=n; j++) {
                if(map[i][j]==3) printf("0 ");
                if(map[i][j]==0) printf("2 ");
                if(map[i][j]==1) printf("1 ");
            }
            printf("
    ");
        }
        return 0;
    }
    View Code

    3.P1767 家族_NOI导刊2010普及(10)

    直通

    坑点(;д;)

      这读入。。。不想说话

    代码酱( • ̀ω•́ )✧

    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    
    const int N = 110;
    const int L = 233;
    int n,lens,ans;
    int map[N][L],vis[N][L];
    string s;
    int dx[4]= {0, 0,1,-1},
        dy[4]= {1,-1,0, 0};
    struct A {
        int x,y;
    };
    
    void bfs(int lx,int ly) {
        queue<A>q;
        A u,v;
        u.x=lx,u.y=ly;
        q.push(u);
        while(!q.empty()) {
            u=q.front();q.pop();
            int x=u.x,y=u.y;
            for(int i=0; i<4; i++) {
                int nx=x+dx[i],ny=y+dy[i];
                if(nx>=0 && nx<n && ny>=0 && ny<lens && map[nx][ny] && !vis[nx][ny]) {
                    vis[nx][ny]=1;
                    v.x=nx,v.y=ny;
                    q.push(v);
                }
            }
        }
        ans++;
    }
    
    int main() {
        scanf("%d",&n);getline(cin,s);
        for(int i=0,len; i<n; i++) {
            getline(cin,s);
            len=s.length();
            lens=max(lens,len);
            for(int j=0; j<len; j++)
                if('a'<=s[j] && s[j]<='z')
                    map[i][j]=1;
        }
        for(int i=0; i<n; i++)
            for(int j=0; j<lens; j++)
                if(!vis[i][j] && map[i][j])
                    bfs(i,j);
        printf("%d",ans);
        return 0;
    }
    View Code

    4.P2666 Bessie的秘密牧场

    直通

    坑点(。・・)ノ

      这题目我一开始读错了,然后就光荣爆零了。。。题目真是很重要。。。

    代码酱= ̄ω ̄=

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    
    int n,v,ans,now;
    int f[110];
    
    void dfs(int step) {
        if(now>n) return ;
        if(step==4) {
            if(now==n)
                ans++;
            return;
        }
        else {
            for(int i=0; i<=v; i++) {
                now+=f[i];
                dfs(step+1);
                now-=f[i];
            }
        }
    }
    
    int main() {
        scanf("%d",&n);
        v=sqrt(n);
        for(int i=0; i<=v; i++) f[i]=i*i;
        dfs(0);
        printf("%d",ans);
        return 0;
    }
    View Code

    5.P2689 东南西北

    直通

    坑点○| ̄|_ 

      注意它读入的方向,栽了。。。(虽然是入门题哈哈哈)

    代码酱╭( ・ㅂ・)و ̑̑

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #define INF 5201314
    using namespace std;
    
    const int M = 1010;
    int T,top,ans=INF,sx,sy,ex,ey;
    int v[M];
    int dx[4] = {0,-1,0,1},
        dy[4] = {1,0,-1,0};
    bool vis[M][M];
    
    void dfs(int x,int y,int t,int s) {
        if(t>T) return ;
        if(x==ex && y==ey) {
            ans=min(ans,s);
            return ;
        }
        int f,nx,ny;
        f=v[t];
        nx=x+dx[f],ny=y+dy[f];
        if(nx>0 && nx<=T && ny>0 && ny<=T && !vis[nx][ny]) {
            vis[nx][ny]=true;
            dfs(nx,ny,t+1,s+1); 
            vis[nx][ny]=false;
        }
        dfs(x,y,t+1,s);
    }
    
    int main() {
        scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
        scanf("%d",&T);
        for(int i=1; i<=T; i++) {
            char a;
            cin>>a;
            top++;
            switch (a) {
                case 'E': v[top]=0; break;
                case 'S': v[top]=1; break;
                case 'W': v[top]=2; break;
                case 'N': v[top]=3; break;
            } 
        }
        dfs(sx,sy,1,0);
        if(ans==INF) printf("-1");
        else printf("%d",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    以&quot;小刀会“的成败论当今创业成败
    COCOS2D 学习笔记
    password加密的算法
    bzoj1087【SCOI2005】互不侵犯King
    HDU--2222--Keywords Search--AC自己主动机
    【leetcode】Subsets II (middle) ☆
    【leetcode】Word Search (middle)
    【hadoop2.6.0】利用JAVA API 实现数据上传
    【leetcode】Palindrome Partitioning II(hard) ☆
    【hadoop2.6.0】利用Hadoop的 Java API
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/7801349.html
Copyright © 2020-2023  润新知