搜索

流过昼夜 提交于 2020-01-20 23:12:32

我这个Blog是补前边没写完的,所以肯定就不可能细讲了,那就直接上代码了

DFS(深度优先搜索)代码:

 1 void InitVisit()
 2 {
 3     // 初始化访问变量
 4     for(int i=0;i<N;i++)
 5         Visited[i] = false;
 6 }
 7  
 8 void DFS(int V)
 9 {
10     // 深度优先搜索算法
11     Visited[V] = true;
12     printf("%d ",V);
13     for(int i=0;i<Nv;i++)
14     {
15         if(!Visited[i]&&G[V][i])
16             DFS(i);
17     }
18 }
19  
20 void ListComponentsWithDFS()
21 {
22     // 深度优先搜索格式输出
23     for(int i=0;i<Nv;i++)
24     {
25         if(!Visited[i])
26         {
27             printf("{ ");
28             DFS(i);
29             printf("}\n");
30         }
31     }
32 }

BFS(广度优先搜索),代码:

 

 1 void BFS(int V)
 2 {
 3     // 广度优先搜索,用队列辅助
 4     const int MAX_SIZE = 100;
 5     int Queue[MAX_SIZE];
 6     int first = -1,last = -1;
 7     Queue[++last] = V;
 8     Visited[V] = true;
 9     while(first<last)
10     {
11         int F = Queue[++first];
12         printf("%d ",F);
13         for(int i=0;i<Nv;i++)
14         {
15             if(G[F][i]&&!Visited[i])
16             {
17                 Queue[++last] = i;
18                 Visited[i] = true;
19             }
20         }
21     }
22 }
23  
24 void ListComponentsWithBFS()
25 {
26     // 广度优先搜索格式输出
27     for(int i=0;i<Nv;i++)
28     {
29         if(!Visited[i])
30         {
31             printf("{ ");
32             BFS(i);
33             printf("}\n");
34         }
35     }
36 }

 

 

 

启发式搜索(IDA*)

例题:洛谷 P1379 八数码难题

 

#include<iostream>
#include<string>
#include<map>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long lt;

int read()
{
    int f=1,x=0;
    char ss=getchar();
    while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}
    while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}
    return f*x;
}

char ss[15];
int ans[4][4]=
{{0,0,0,0},
 {0,1,2,3},
 {0,8,0,4},
 {0,7,6,5}};
int a[5][5],k,judge;
int nxtx[]={0,1,-1,0};
int nxty[]={1,0,0,-1};

int check()
{
    for(int i=1;i<=3;++i)
    for(int j=1;j<=3;++j)
    if(ans[i][j]!=a[i][j])return 0;
    return 1;
}

int test(int step)
{
    int cnt=0;
    for(int i=1;i<=3;++i)
    for(int j=1;j<=3;++j)
    if(ans[i][j]!=a[i][j]){ if(++cnt+step>k) return 0;}
    return 1;
}

void A_star(int step,int x,int y,int pre)
{
    if(step==k){ if(check())judge=1; return;}达到当前限制的最大深度
    if(judge) return;
    for(int i=0;i<4;++i)
    {
        int nx=x+nxtx[i],ny=y+nxty[i];
        if(nx<1||nx>3||ny<1||ny>3||pre+i==3) continue;//加入了上述最优性剪枝
        swap(a[x][y],a[nx][ny]);
        if(test(step)&&!judge) A_star(step+1,nx,ny,i);//A*估价合法再向下搜索
        swap(a[x][y],a[nx][ny]);
    }
}

int main()
{
    int x,y;
    scanf("%s",&ss);
    for(int i=0;i<9;++i)
    {
        a[i/3+1][i%3+1]=ss[i]-'0';
        if(ss[i]-'0'==0)x=i/3+1,y=i%3+1;
    }
    if(check()){printf("0");return 0;}//特判不用移动
    while(++k)//枚举最大深度
    {
        A_star(0,x,y,-1);
        if(judge){printf("%d",k);break;}
    }
    return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!