膜拜大神,逢考必过
程序代码:
#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编辑过]