【洛谷】搜索专题

前言

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

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

1.P1019 单词接龙

直通

思路_(:з」∠)_

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

坑点o_O

  ①我回溯写错了qaq

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

代码酱=u=

#include 
#include 
#include 
#include 
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)
                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) {
        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) w[i].emm();
}

int main() {
    scanf("%d",&n);
    for(int i=0,lena; 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)
        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 
#include 
#include 
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) {
    queueq;
    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("\n");
    }
    return 0;
}
View Code

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

直通

坑点(;д;)

  这读入。。。不想说话

代码酱( • ̀ω•́ )✧


4.P2666 Bessie的秘密牧场

直通

坑点(。・・)ノ

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

代码酱= ̄ω ̄=

#include 
#include 
#include 
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 
#include 
#include 
#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

 

转载于:https://www.cnblogs.com/zxqxwnngztxx/p/7801349.html

你可能感兴趣的:(【洛谷】搜索专题)