|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include<stdio.h>
- #define M 8 //行数
- #define N 8 //列数
-
- int mg[M+2][N+2]={ //一个迷宫,其四周要加上均为1的外框
- {1,1,1,1,1,1,1,1,1,1},
- {1,0,0,0,0,0,0,0,0,1},
- {1,0,0,1,1,0,1,1,0,1},
- {1,0,0,1,0,0,1,0,0,1},
- {1,0,1,1,1,0,1,1,0,1},
- {1,0,0,1,0,0,1,0,0,1},
- {1,0,0,1,1,0,1,0,0,1},
- {1,0,1,0,0,0,0,1,0,1},
- {1,0,0,0,0,1,0,0,0,1},
- {1,1,1,1,1,1,1,1,1,1}
- };
- int GS[10][10]={0}; //定义一个二维数组,来存储怪兽的伤害
- struct migong{
- int i; //路径横坐标
- int j; //路径纵坐标
- int di; //方向
- }Stack[100],Path[100]; //定义栈和存放最短路径的数组
- int top=-1; //栈顶指针,空时为-1
- int sum=0; //伤害
- int min = 1000000;//最小的伤害
- int minlen=0;//最小伤害对应的路径
- void Printmap()//地图的初始化函数
- {
- int i,j;
- for(i=0;i<M+2;i++)
- {
- for(j=0;j<N+2;j++)
- {
- if(mg[i][j] == 1)
- {
- printf("█");
- }
- else
- {
- printf(" ");
- }
- }
- printf("\n");
- }
- }
- void StartGS()//怪兽地图的初始化
- {
- int you=srand(time(0));//产生一个随机种子
- int i,j;
- for(i=0;i<10;i++)
- {
- for(j=0;j<10;j++)
- {
- GS[i][j]=rand(you)%100+1;//产生一个1~100的随机数
- }
- }
- }
- void mgpath()
- { //路径为:(1,1)->(M,N)
- int i,j,di,find,k;
- top++;
- Stack[top].i=1;
- Stack[top].j=1;
- Stack[top].di=-1; //第一个点入栈
- mg[1][1]=-1; //在地图上做标记
- while(top>-1)
- { //栈不空时循环
- i=Stack[top].i;
- j=Stack[top].j;
- di=Stack[top].di; //方向标记
-
- if(i==M && j==N)
- { //找到了出口,输出路径
- printf("路径:");
- for(k=0;k<=top;k++) //输出整个队列
- {
- printf("(%d,%d) ",Stack[k].i,Stack[k].j);
- sum+=GS[Stack[k].i][Stack[k].j]; //计算伤害
- if((k+1)%5==0) //输出时每5个结点换一行
- printf("\n\t");
- }
- printf("此路径的伤害是%d",sum);//输出对应的伤害
- printf("\n");
- if(sum<min)
- { //比较输出最小路径
- for(k=0;k<=top;k++)
- Path[k]=Stack[k]; //对应的路径进栈
- minlen = top++;
- min=sum;
- }
- sum=0;//清零,等待下一次的计算
- mg[Stack[top].i][Stack[top].j]=0; //让该位置变为其他路径的可走结点
- top--;
- i=Stack[top].i;j=Stack[top].j;di=Stack[top].di;
- }
-
- find=0;
- while(di<4 && find==0)
- { //找下一个可走结点
- di++;
- switch(di)
- {
- case 0:i=Stack[top].i-1;j=Stack[top].j;break; //上面
- case 1:i=Stack[top].i;j=Stack[top].j+1;break; //右边
- case 2:i=Stack[top].i+1;j=Stack[top].j;break; //下面
- case 3:i=Stack[top].i;j=Stack[top].j-1;break; //左边
- }
- if(mg[i][j]==0)
- find=1;
- }
- if(find == 1)
- { //找到了下一个可走结点
- Stack[top].di=di; //修改原栈顶元素的di值
- top++; //下一个可走结点进栈
- Stack[top].i=i;
- Stack[top].j=j;
- Stack[top].di=-1;
- mg[i][j]=-1; //避免重复走到该结点
- }
- else
- {
- mg[Stack[top].i][Stack[top].j]=0; //让该位置变为其他路径的可走结点
- top--;
- }
- }
- printf("最小伤害路径如下:\n");
- printf("最小伤害伤害是 %d\n",min);
- printf("路径: ");
- for(k=0;k<minlen;k++)
- {
- printf("(%d,%d) ",Path[k].i,Path[k].j);
- if((k+1)%5==0) //输出时每5个结点换一行
- printf("\n\t");
- }
- printf("\n");
- }
- int main()
- {
- printf("dituruxia;");
- Printmap();
- StartGS();
- printf("迷宫所有的路径如下:\n");
- mgpath();
- return 0;
- }
复制代码 |
|