迷宫2--矩阵中任意两点最短路(8个方向) dfs 效率很低
2011-06-13 19:51
393 查看
//求一个矩形中任意两点之间的最短路(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; }
相关文章推荐
- 迷宫--矩阵中任意两点之间最短路-4个方向(dfs)
- 迷宫3--快速求解任意两点之间一条路,并不是最短(dfs)
- 任意两点最短路 Floyd-Warshall算法 传递闭包
- ACM: 方向dfs + bfs求最短路 poj 3…
- 【LCA转RMQ求树上任意两点最短路】HDU 2874
- 迷宫------FZU - 2256 (利用 Vector数组基本用法与模拟建树)&&(dfs对树的深度遍历找最短路)
- UVa 10803 Thunder Mountain (任意两点最短路的最大值+Floyd)
- POJ 3268 Silver Cow Party(最短路 dijkstra求任意两点最短路)
- 迷宫问题(八个方向寻找)DFS
- Codeforces Beta Round #89 (Div. 2)E题,给一联通的无向图,求确定每边的方向,使得任意两点可达
- POJ 1125 Stockbroker Grapevine(任意两点的最短路,FLoyed 算法)
- hdu 4460 求所有任意两点间的最短路
- HDU 5723 Abandoned country (并查集 + DFS+求解树上任意两点间的距离的平均值)
- Floyd-Warshall算法求任意两点间的最短路(图论算法)
- HDU 1728 逃离迷宫 单方向BFS 或者DFS加剪枝
- floyd 任意两点最短路
- AOJ -0189 Convenient Location && poj 2139 Six Degrees of Cowvin Bacon (floyed求任意两点间的最短路)
- [fzu 2271]不改变任意两点最短路至多删的边数
- pku1204 Word Puzzles AC自动机 二维字符串矩阵8个方向找模式串的起点坐标以及方向 挺好的!
- Floyd算法 求任意两点的最短路