实例编程:迷宫探路III

将从迷宫入口到各点的最短路近的集合看作一棵树。用广度遍历的方法即可找到出口的最短路近。本程序算法思想来源于求图上一点到其余各点最短路近的Dijkstra算法。

/* 迷宫探路III(最短路径)*/

/* DIJKSTRAMAZE.C */

/* 2003-8-26 */

#include <stdlib.h>

#include <time.h>

#include <math.h>

#include <stdio.h>

#include <graphics.h>

#define N 22

#define M 22

int bg[M][N];

int aa[M][N];

struct pace{

int pre;

int x;

int y;

int ri;

int rj;

}road[M*N];

struct pace bestroad[M*N];

void makebg(int,int);

void drawbg(int[][],int,int,int,int,int);

void drawman(int,int,int);

void rect(int,int,int,int);

void main(){/* main()开始 */

int step=20;

int len=10;

int size=20;

int x=0,y=0;

int i=0,j=0;

int gdriver=DETECT,gmode;

char ch;

int direc;

int routelen=0;

int dj[]={-1,1,0,0};

int di[]={0,0,-1,1};

int begin;

int end;

int k;

int t;

int num;

int suc;

int cnt;

int x0;

int y0;

int le;

int tmp;

makebg(M,N);

/*  registerbgidriver(EGAVGA_driver);

initgraph(&gdriver,&gmode,"c:\turboc2");*/

initgraph(&gdriver,&gmode,"c:\tc20\bgi");

cleardevice();

setwritemode(XOR_PUT);

settextstyle(1,0,3);

setcolor(GREEN);

outtextxy(100,180,"DIJKSTRA MAZE");

setcolor(BLUE);

setfillstyle(LINE_FILL,BLUE);

/*drawbg(bg,M,N,size,0,0);*/

drawbg(aa,M,N,size,0,0);

setcolor(WHITE);

x+=len;y+=len;

drawman(x,y,len);

x0=x;y0=y;

/* 电脑控制 */

i=j=0;

aa[0][0]=1;

begin=0;

end=0;

road[0].ri=0;

road[0].rj=0;

road[0].x=x0;

road[0].y=y0;

road[0].pre=-1;

le=1;

suc=0;

while(!suc){

cnt=0;

le++;

for(k=begin;k<=end;k++){

for(t=0;t<4;t++){

x=road[k].x+dj[t]*step;

y=road[k].y+di[t]*step ;

i=road[k].ri+di[t];

j=road[k].rj+dj[t];

if(i<M&&i>=0&&j<N&&j>=0&&aa[i][j]==0){

cnt++;

aa[i][j]=le;

road[end+cnt].pre=k;

road[end+cnt].x=x;

road[end+cnt].y=y;

road[end+cnt].ri=i;

road[end+cnt].rj=j;

if(i==N-1&&j==M-1){

suc=1;

break;

}

}

}

if(suc)break;

}

begin=end+1;

end=end+cnt;

}

/* output */

i=end;j=0;

while(i!=-1){

bestroad[j].x=road[i].x;

bestroad[j].y=road[i].y;

bestroad[j].ri=road[i].ri;

bestroad[j].rj=road[i].rj;

i=road[i].pre;

j++;

}

for(i=0;i<j/2;i++){

tmp=bestroad[i].x;

bestroad[i].x=bestroad[j-1-i].x;

bestroad[j-1-i].x=tmp;

tmp=bestroad[i].y;

bestroad[i].y=bestroad[j-1-i].y;

bestroad[j-1-i].y=tmp;

}

getch();

drawman(x0,y0,len);

for(i=0;i<j;i++){

drawman(bestroad[i].x,bestroad[i].y,len);

delay(80000);

drawman(bestroad[i].x,bestroad[i].y,len);

}

i--;

drawman(bestroad[i].y,bestroad[i].x,len);

getch();

closegraph();

}

/* main()结束 */

/* 绘制小人 */

void drawman(int x,int y,int len){

int r=len/4;

rect(x-r,y-len,x+r,y-len+2*r);

line(x,y-len+2*r,x,y);

line(x-len,y,x+len,y);

line(x,y,x-len,y+len);

line(x,y,x+len,y+len);

}

/* 绘制迷宫地图 */

void drawbg(int bg[][N],int a,int b,int size,int x,int y){

int startx=x;

int i,j;

for(i=0;i<a;i++){

for(j=0;j<b;j++){

if(bg[i][j]==-1)

rect(x,y,x+size-1,y+size-1);

x+=size;

}

x=startx;

y+=size;

}

rectangle(0,0,size*b,size*a);

line(0,0,size,0);line(0,0,0,size);

line(size*b,size*(a-1),size*b,size*a);

line(size*(b-1),size*a,size*b,size*a);

}

/* 绘制实心矩形 */

void rect(int x0,int y0,int x1,int y1){

int i,j;

for(i=x0;i<=x1;i++)

line(i,y0,i,y1);

}

/* 随机生成代表迷宫地图的数组  */

void makebg(int a,int b){

int i,j;

int ran;

int direc;

/* 初始化迷宫地图  */

for(i=0;i<a;i++)

for(j=0;j<b;j++)

bg[i][j]=1;

/* 随机生成迷宫通路  */

randomize();

i=j=0;direc=2;

while(1){

bg[i][j]=0;

if(i>=M-1&&j>=N-1)break;

ran=(int)rand()*4;

if(ran<1){

if(direc!=1&&i<a-1){

i++;

direc=3;

}

}

else if(ran<2){

if(direc!=2&&j>0){

j--;

direc=0;

}

}

else if(ran<3){

if(direc!=3&&i>0){

i--;

direc=1;

}

}

else {

if(direc!=0&&j<b-1){

j++;

direc=2;

}

}

}

/* 随机生成迷宫其余部分  */

for(i=0;i<a;i++)

for(j=0;j<b;j++)

if(bg[i][j]==1){

ran=(int)rand()*10;

if(ran<5)bg[i][j]=0;

}

for(i=0;i<a;i++)

for(j=0;j<b;j++){

if(bg[i][j]==1)aa[i][j]=-1;

else aa[i][j]=0;

}

}

时间: 2024-11-02 13:28:13

实例编程:迷宫探路III的相关文章

迷宫探路III(最短路径)

    将从迷宫入口到各点的最短路近的集合看作一棵树.用广度遍历  的方法即可找到出口的最短路近.本程序算法思想来源于求图上一点  到其余各点最短路近的Dijkstra算法.  /* 迷宫探路III(最短路径)*//* DIJKSTRAMAZE.C *//* 2003-8-26 */#include <stdlib.h>#include <time.h>#include <math.h>#include <stdio.h>#include <graph

实例编程:迷宫探路II

对<迷宫探路>做了一点改进.小人在行走过程中不走回头路,即不重复经过同一点. /* crazymaze.c*/ /* 2003-8-26 */ #include <stdlib.h> #include <time.h> #include <math.h> #include <stdio.h> #include <graphics.h> #define N 22 #define M 22 #define MAXLEN 200; int

关闭window-有关c#的实例编程问题

问题描述 有关c#的实例编程问题 using System.Runtime.InteropServices;using System.Text; [DllImport("user32")] public static extern long SetWindowPos(long hwnd,long hWndInsertAfter,long X,long y,long cx,long cy,long wFlaglong); [DllImport("user32")] p

迷宫探路II

      对<迷宫探路>做了一点改进.小人在行走过程中不走回头路, 即不重复经过同一点.                      /* crazymaze.c*//* 2003-8-26 */#include <stdlib.h>#include <time.h>#include <math.h>#include <stdio.h>#include <graphics.h>#define N 22#define M 22#defi

迷宫探路IV(递归算法)

/* 迷宫探路(recursive)*//* recursivemaze.c *//* 2003-10-16 */#include <stdlib.h>#include <time.h>#include <math.h>#include <stdio.h>#include <graphics.h>#define N 22#define M 22#define MAXLEN M*Nint bg[M][N];int aa[M][N];struct p

实例编程:迷宫探路I

曾经听说过一个走迷宫的诀窍:顺着墙沿一侧走. (一直沿左侧或一直沿右侧).本程序实现了这一 思想,小人一直沿左侧走. 迷宫是随机生成的. 开始时,按数字 1 键进入人工控制模式:按w,s, a,d分别代表上,下,左,右方向. 开始时,按除数字 1 以外的任意键进入自动模式: 小人由电脑控制. 按 Q键结束程序. /* Name: maze.c Author: zhuqing Description: 迷宫探险 Date: 28-08-03 10:15 Copyright: */ #include

.NET组件控件实例编程系列——2.用Label控件模拟网页链接的组件

从本篇开始会通过实例介绍如何实现组件控件编程.在上一篇中提到通过组合实现组件编程,达到灵 活添加功能的效果.那么是如何组合的呢?一般是通过事件,在组件中处理控件的相关事件,在事件处理 程序中封装需要的功能. 本篇的实例是用Label模拟网页链接的效果.在.NET控件库中已经提供了LinkLabel控件,但该控件强 制显示下划线,而且只能改变链接颜色,不能改变背景色.这里通过处理Label控件的鼠标事件,动态改 变其显示相关属性,即可模拟出网页链接的效果.而且在事件中可以加入更多的效果,比Link

.NET组件控件实例编程系列——1.开篇

网上已经有很多关于组件和控件的文章了,我也是通过这些文章慢慢学会这些技术的.但那些文章主 要是教程式的,给的例子虽然简单容易理解,但针对实际应用的例子比较少.这里把我在工作和学习中做 过的组件和控件的实现方法贴出来,希望对初学者能有帮助.当然我的代码中也会存在不少问题,有些解 决方法也并不完美,希望看到的朋友不吝赐教. 首先把我之前参考的系列文章的链接贴出来,里面有比较详细的教程,对初学者帮助较大. .NET组件编程 http://www.cnblogs.com/mapserver/catego

Javascript &amp;amp; DHTML 实例编程(教程)DOM基础和基本API_基础知识

一.什么是DOM? 什么叫DOM,DOM是文档对象模型(Document Object Model,是基于浏览器编程(在本教程中,可以说就是DHTML编程)的一套API接口,W3C出台的推荐标准,每个浏览器都有一些细微的差别,其中以Mozilla的浏览器最与标准接近.单纯的Javascript要结合DOM才能做DHTML编程,才能做出漂亮的效果.应用于WEB.这点几乎与其它的语言无异,正如C/C++需要库支持是一样的道理.否则就是单纯的在语法上做研究了.因此,必须要对DOM有一定的认识,才能把J