我这个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*)
#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;
}
来源:https://www.cnblogs.com/DeNeRATe/p/12219627.html