我这个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