搜索例题 2019/7/3

Posted thmyl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索例题 2019/7/3相关的知识,希望对你有一定的参考价值。

例题1

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,x,y,map[16][16],cnt;
char ch[10];
bool vis[16][16];
void dfs(int x,int y)
    cnt++;
    vis[x][y]=1;
    if((map[x+1][y]==map[x][y])&&!vis[x+1][y])dfs(x+1,y);
    if((map[x][y+1]==map[x][y])&&!vis[x][y+1])dfs(x,y+1);
    if((map[x-1][y]==map[x][y])&&!vis[x-1][y])dfs(x-1,y);
    if((map[x][y-1]==map[x][y])&&!vis[x][y-1])dfs(x,y-1);

int main()
     scanf("%d%d%d%d",&n,&m,&x,&y);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%s",ch);
            if(ch[0]==A)map[i][j]=1;
            if(ch[0]==B)map[i][j]=2;
            if(ch[0]==C)map[i][j]=3;
            if(ch[0]==D)map[i][j]=4;
        
    
    if(!map[x][y])
        puts("0");
        return 0;
    
    dfs(x,y);
    printf("%d\n",cnt);
    return 0;

例题2

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,ans,cnt[2],a[2][100010];
bool vis[100010];
int main()
    scanf("%d%d",&n,&k);
    if(n==k)
        puts("0");
        return 0;
    
    vis[n]=1;
    a[0][++cnt[0]]=n;
    bool f=0;
    while(1)
        ans++;
        f=!f;
        for(int i=1;i<=cnt[!f];i++)
            int cur;
            cur=a[!f][i]+1;
            if(cur<=100000&&cur>=0)
                if(!vis[cur])
                    if(cur==k)
                        printf("%d\n",ans);
                        return 0;
                    
                    else 
                        vis[cur]=1;
                        a[f][++cnt[f]]=cur;
                    
                
            
            cur=a[!f][i]-1;
            if(cur<=100000&&cur>=0)
                if(!vis[cur])
                    if(cur==k)
                        printf("%d\n",ans);
                        return 0;
                    
                    else 
                        vis[cur]=1;
                        a[f][++cnt[f]]=cur;
                    
                
            
            cur=a[!f][i]*2;
            if(cur<=100000&&cur>=0)
                if(!vis[cur])
                    if(cur==k)
                        printf("%d\n",ans);
                        return 0;
                    
                    else 
                        vis[cur]=1;
                        a[f][++cnt[f]]=cur;
                    
                
            
        
        cnt[!f]=0;
    
    return 0;

 

 

例题4

#include<cstdio>
#include<iostream>
#include<map>
#define M 45
#define ll long long
using namespace std;
ll a[M],s1[M],s2[M],n,key,ans;
map<ll,int> hash;
void dfs(int x,int sum,int flag) 
    if(!flag&&x>n/2) 
        hash[sum]++;
        return;
    
    if(flag&&x>n) 
        ans+=hash[key-sum];
        return;
    
    dfs(x+1,sum+a[x],flag);
    dfs(x+1,sum,flag);

int main() 
    cin>>n>>key;
    for(int i=1; i<=n; i++)
        cin>>a[i];
    dfs(1,0,0);
    dfs(n/2+1,0,1);
    cout<<ans;
    return 0;

 

以上是关于搜索例题 2019/7/3的主要内容,如果未能解决你的问题,请参考以下文章

深度搜索(dfs)+典型例题(八皇后)

DFS 深度优先搜索例题

机试指南第六章-搜索-例题自解

Wireshark例题-CTF

搜索例题

深度优先搜索和广度优先搜索的深入讨论