迷宫--矩阵中任意两点之间最短路-4个方向(dfs)
2011-06-13 17:29
357 查看
//求一个矩形中任意两点之间的最短路(4个方向)+记录路径 #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,lenmin,tag,cur,n,m,flag; int dir[8]={1,0,0,1,-1,0,0,-1}; void DFS(int x,int y,int cur) { int i; if(x==thex&&y==they) { flag=1;tag=1; if(cur<lenmin) { lenmin=cur; for(i=0;i<lenmin;i++) {minx[i]=savex[i];miny[i]=savey[i];} } } else { for(i=0;i<4;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=99999;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=%d/n",lenmin-1); /* printf("(%d,%d)",minx[0],miny[0]); for(i=1;i<lenmin;i++) printf("->(%d,%d)",minx[i],miny[i]);*/ for(i=0;i<lenmin;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; }
相关文章推荐
- 迷宫2--矩阵中任意两点最短路(8个方向) dfs 效率很低
- 迷宫3--快速求解任意两点之间一条路,并不是最短(dfs)
- 求任意大小矩阵两点之间的最短路径(回溯)
- 马踏棋盘3--求任意两点之间最短路
- poj:1125Floyd(求任意点之间的最短路)
- HDU2586(LCA应用:在带权树中求任意两点之间的距离)
- joj 2737 狼与羊的故事 求任意两点之间的必经之路
- 用FLOYD算法求特殊图的任意两点之间的距离
- 迷宫问题(八个方向寻找)DFS
- Floyd算法,求两点之间的最短路
- ACM: 方向dfs + bfs求最短路 poj 3…
- 【LCA转RMQ求树上任意两点最短路】HDU 2874
- [fzu 2271]不改变任意两点最短路至多删的边数
- hdu 2376 Average distance DFS 求树上任意两点距离和
- 关于任意两点之间移动的一些算法
- 任意两点之间最短路径
- SilverLight用代码实现对任意控件向4个方向进行3D旋转的类
- Floyd-Warshall算法(求解任意两点间的最短路) 详解 + 变形 之 poj 2253 Frogger
- 画任意两点之间的连线
- 给定一个平面内三个不同的点p1、p2和p3,求出任意两点(即点p1和点p2、点p1和点p3、点p2和点p3)之间的距离。