您的位置:首页 > 其它

迷宫--矩阵中任意两点之间最短路-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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  math.h ini null