膜拜大神,逢考必过
程序代码:#include<stdio.h>
#define N 11
int setlevel(int a[][N],int x,int y,int l)
{//设置指定坐标点层级,如果坐标点是出口则返回1,否则返回0
if(x<0||x>=N||y<0||y>=N)return 0; //坐标不合格以0返回
if(a[x][y]==N*N+2)
return 1;
if(!a[x][y])a[x][y]=l+1;
return 0;
}
int shortpath(char a[][N])
{//找最短路径,找到则标注并返回1,否则返回0
int i,j,k,l,m=0,x,y,b[N][N],c[]={-1,0,1,0,0,-1,0,1};
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
b[i][j]=0;
if(a[i][j]=='*')b[i][j]=N*N+1;
if(a[i][j]=='E')b[i][j]=N*N+2;
if(a[i][j]=='S')b[i][j]=1;
}
}
for(k=1;k<N*N;k++)
{
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(b[i][j]==k)
{
for(l=0;l<8;l+=2)
{
m=setlevel(b,i+c[l],j+c[l+1],k);
if(m)
{
for(x=0;x<N;x++)
{
for(y=0;y<N;y++)printf("%4d",b[x][y]);
printf("\n");
}
printf("\n%d:墙,%d:出口,1:入口 0:空地方\n\n",N*N+1,N*N+2);
break;
}
}
if(m)break;
}
if(m)break;
}
if(m)break;
}
if(m)break;
}
if(m)
{
while(b[i][j]!=1)
{
a[i][j]='o';
x=i;
y=j;
k=b[x][y];
for(l=0;l<8;l+=2)
{
if(i+c[l]>=0&&i+c[l]<N&&j+c[l+1]>=0&&j+c[l+1]<N&&b[i+c[l]][j+c[l+1]]>0&&b[i+c[l]][j+c[l+1]]<k)
{
x=i+c[l];
y=j+c[l+1];
k=b[x][y];
}
}
i=x;
j=y;
}
}
return m;
}
int main()
{
char k[N][N]=
{
{"**********"},
{"* S* *E*"},
{"* *** ** *"},
{"* * * * *"},
{"* *"},
{"*** * ** *"},
{"** * *"},
{"** ** ** *"},
{"* *"},
{"**********"},
};
int m;
for(m=0;m<N;m++)printf("%s\n",&k[m][0]); //显示未标注路径的地图
if(shortpath(k))
{
printf("Yes\n");
for(m=0;m<N;m++)printf("%s\n",&k[m][0]); //显示标注路径的地图
}
else printf("No\n");
return 0;
}
[此贴子已经被作者于2016-12-21 14:04编辑过]











~~~
那个答案算法算不算是递归~~~~
)~