从迷宫入口点(1,1)出发,出口点(m,n);
1.求所有路径条数
2.求最短路径条数
3.输出一条最短路径
题解:向四周搜索,记下所有一步能到达的坐标点;然后依次再从这些点出发,再记下所有一步能到达的坐标点,…,依此类推,直到到达迷宫的出口点(m,n)为止,然后从出口点沿搜索路径回溯直至入口。这样就找到了一条迷宫的最短路径,否则迷宫无路径。
bfs求2,3
#include<stdio.h>
#define m 5
#define n 5
struct point{
int x;
int y;
int pre;
int len;
}Q[5005];
int ans=0;
int a[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
int f[m+2][n+2]={1,1,1,1,1,1,1,//0可以过
1,0,0,0,1,0,1,
1,0,1,0,0,0,1,
1,0,0,1,0,1,1,
1,1,1,0,1,0,1,
1,0,1,1,1,0,1,
1,1,1,1,1,1,1};
void Out(int k){//输出一条最短路径
while(Q[k].pre>0){
printf("(%d,%d)<--",Q[k].x,Q[k].y);
k=Q[k].pre;
}
printf("(%d,%d)",Q[1].x,Q[1].y);
}
void bfs(){
int i,j,k=1,top=1,x1,y1,find=0;
Q[k].x=1;//始点入队列
Q[k].y=1;
Q[k].pre=0;
Q[k].len=0;
f[1][1]=-1;
while(top<=k && !find){
for(i=0;i<8;i++){
x1=Q[top].x+a[i][0];
y1=Q[top].y+a[i][1];
if(f[x1][y1]==0){
k++;
Q[k].x=x1;//入队列
Q[k].y=y1;
Q[k].pre=top;
Q[k].len=Q[top].len+1;
f[x1][y1]=-1;//避免重复搜索
}
if((x1==m) && (y1==n)){
find=1;
printf("%d\n",Q[k].len);//输出最短路径长度
Out(k);//输出一条最短路径
break;
}
}
top++;
}
if(find==0){
printf("NO path\n");
}
}
int main(){
bfs();
return 0;
}
dfs求1
#include<stdio.h>
#define m 5
#define n 5
struct point{
int x;
int y;
int pre;
}Q[5005];
int ans=0;
int a[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
int f[m+2][n+2]={1,1,1,1,1,1,1,//0可以过
1,0,0,0,1,0,1,
1,0,1,0,0,0,1,
1,0,0,1,0,1,1,
1,1,1,0,1,0,1,
1,0,1,1,1,0,1,
1,1,1,1,1,1,1};
int dfs(int x,int y){
int i,x1,y1;
if(x==m&&y==n){
ans++;
return 0;
}
else{
for(i=0;i<8;i++){
x1=x+a[i][0];
y1=y+a[i][1];
if(f[x1][y1]==0){
f[x1][y1]=1;
dfs(x1,y1);
f[x1][y1]=0;
}
}
}
return 0;
}
int main(){
f[1][1]=0;
dfs(1,1);
printf("%d",ans);
return 0;
}