//求一个矩形中任意两点之间的最短路(8个方向)+记录路径 dfs 效率很低 #include "stdio.h" #include "math.h" #include "string.h" #include "stdlib.h" #include "time.h" int mark[1000][1000],savex[1000],savey[1000],minx[1000],miny[1000]; int count,thex,they,tag,cur,n,m,flag,lencur; double len,lenmin; int dir[16]={1,0,0,1,-1,0,0,-1,1,1,1,-1,-1,1,-1,-1}; void DFS(int x,int y,int cur) { int i; if(x==thex&&y==they) { flag=1;tag=1; len=0; for(i=0;i<cur-1;i++) len+=sqrt((savex[i+1]-savex[i])*(savex[i+1]-savex[i])+(savey[i+1]-savey[i])*(savey[i+1]-savey[i])); if(len<lenmin) { lenmin=len;lencur=cur; for(i=0;i<cur;i++) {minx[i]=savex[i];miny[i]=savey[i];} } } else { for(i=0;i<8;i++) if(x+dir[2*i]>=0&&x+dir[2*i]<=m-1&&y+dir[2*i+1]>=0&&y+dir[2*i+1]<=n-1&&!mark[x+dir[2*i]][y+dir[2*i+1]]) { mark[x+dir[2*i]][y+dir[2*i+1]]=1; savex[cur]=x+dir[2*i];savey[cur]=y+dir[2*i+1]; DFS(x+dir[2*i],y+dir[2*i+1],cur+1); mark[x+dir[2*i]][y+dir[2*i+1]]=0; } } } int main() { int i,j,a,b; printf("请输入矩阵的规模n,m:"); while(scanf("%d %d",&n,&m)!=EOF) { flag=0;count=0;lenmin=999999;tag=0; srand((unsigned) time(NULL)); memset(mark,0,sizeof(mark)); for(i=0;i<n*m/2;i++) mark[rand()%n][rand()%m]=1; printf("原始迷宫为:/n"); for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(mark[j][i]==1) printf(" 1 "); else printf(" 0 "); } printf("/n"); } printf("请输入起始坐标:"); scanf("%d %d",&a,&b); printf("请输入终点坐标:"); scanf("%d %d",&thex,&they); memset(savex,0,sizeof(savex)); memset(savey,0,sizeof(savey)); savex[0]=a;savey[0]=b; mark[a][b]=1; DFS(a,b,1); if(flag==0) printf("N0 way/n"); else { printf("minRode=%.3f/n",lenmin); for(i=0;i<lencur;i++) mark[minx[i]][miny[i]]=2; for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(mark[j][i]==1) printf(" 1 "); else if(mark[j][i]==0) printf(" 0 "); else printf(" 2 "); } printf("/n"); } printf("/n"); } printf("请输入矩阵的规模n,m:"); } return 0; }