這個可行的
我們提供的服務有:成都做網(wǎng)站、成都網(wǎng)站建設、成都外貿網(wǎng)站建設、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、永城ssl等。為超過千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的永城網(wǎng)站制作公司
/*4.3.3源程序*/
#include graphics.h
#include stdlib.h
#include stdio.h
#include conio.h
#include dos.h
#define N 20/*迷宮的大小,可改變*/
int oldmap[N][N];/*遞歸用的數(shù)組,用全局變量節(jié)約時間*/
int yes=0;/*yes是判斷是否找到路的標志,1找到,0沒找到*/
int way[100][2],wayn=0;/*way數(shù)組是顯示路線用的,wayn是統(tǒng)計走了幾個格子*/
void Init(void);/*圖形初始化*/
void Close(void);/*圖形關閉*/
void DrawPeople(int *x,int *y,int n);/*畫人工探索物圖*/
void PeopleFind(int (*x)[N]);/*人工探索*/
void WayCopy(int (*x)[N],int (*y)[N]);/*為了8個方向的遞歸,把舊迷宮圖拷貝給新數(shù)組*/
int FindWay(int (*x)[N],int i,int j);/*自動探索函數(shù)*/
void MapRand(int (*x)[N]);/*隨機生成迷宮函數(shù)*/
void PrMap(int (*x)[N]);/*輸出迷宮圖函數(shù)*/
void Result(void);/*輸出結果處虧衡尺理*/
void Find(void);/*成功處理*/
void NotFind(void);/*失敗處理*/
void main(void)/*主函數(shù)*/
{
int map[N][N]; /*迷宮數(shù)組*/
char ch;
clrscr();
printf("\n Please select hand(1) else auto\n");/*選擇探索方式*/
scanf("%c",ch);
Init(); /*初始化*/
MapRand(map);/*生成迷宮*/
PrMap(map);/*顯示迷宮圖*/
if(ch=='1')
PeopleFind(map);/*人工探索*/
else
FindWay(map,1,1);/*系統(tǒng)自動從下標1,1的銷高地方開始探索*/
Result();/*輸出結果*/
Close();
}
void Init(void)/*圖形初始化*/
{
int gd=DETECT,gm;
initgraph(gd,gm,"c:\\tc");
}
void DrawPeople(int *x,int *y,int n)/*畫人工控制圖*/
{/*如果將以下兩句注釋掉,則顯示人工走過的攔仔路徑,*/
setfillstyle(SOLID_FILL,WHITE); /*設置白色實體填充樣式*/
bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);
/*恢復原通路*/
switch(n)/*判斷x,y的變化,8個方向的變化*/
{
case 1: (*x)--;break; /*上*/
case 2: (*x)--;(*y)++;break ;/*右上*/
case 3: (*y)++;break; /*右*/
case 4: (*x)++;(*y)++;break; /*右下*/
case 5: (*x)++;break; /*下*/
case 6: (*x)++;(*y)--;break; /*左下*/
case 7: (*y)--;break; /*左*/
case 8: (*x)--;(*y)--;break; /*左上*/
}
setfillstyle(SOLID_FILL,RED);/*新位置顯示探索物*/
bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);
}
void PeopleFind(int (*map)[N])/*人工手動查找*/
{
int x,y;
char c=0;/*接收按鍵的變量*/
x=y=1;/*人工查找的初始位置*/
setcolor(11);
line(500,200,550,200);
outtextxy(570,197,"d");
line(500,200,450,200);
outtextxy(430,197,"a");
line(500,200,500,150);
outtextxy(497,130,"w");
line(500,200,500,250);
outtextxy(497,270,"x");
line(500,200,450,150);
outtextxy(445,130,"q");
line(500,200,550,150);
outtextxy(550,130,"e");
line(500,200,450,250);
outtextxy(445,270,"z");
line(500,200,550,250);
outtextxy(550,270,"c");/*以上是畫8個方向的控制介紹*/
setcolor(YELLOW);
outtextxy(420,290,"Press 'Enter' to end");/*壓回車鍵結束*/
setfillstyle(SOLID_FILL,RED);
bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);/*入口位置顯示*/
while(c!=13)/*如果按下的不是回車鍵*/
{
c=getch();/*接收字符后開始各個方向的探索*/
if(c=='w'map[x-1][y]!=1)
DrawPeople(x,y,1);/*上*/
else
if(c=='e'map[x-1][y+1]!=1)
DrawPeople(x,y,2);/*右上*/
else
if(c=='d'map[x][y+1]!=1)
DrawPeople(x,y,3);/*右*/
else
if(c=='c'map[x+1][y+1]!=1)
DrawPeople(x,y,4);/*右下*/
else
if(c=='x'map[x+1][y]!=1)
DrawPeople(x,y,5);/*下*/
else
if(c=='z'map[x+1][y-1]!=1)
DrawPeople(x,y,6); /*左下*/
else
if(c=='a'map[x][y-1]!=1)
DrawPeople(x,y,7); /*左*/
else if(c=='q'map[x-1][y-1]!=1)
DrawPeople(x,y,8); /*左上*/
}
setfillstyle(SOLID_FILL,WHITE); /*消去紅色探索物,恢復原迷宮圖*/
bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);
if(x==N-2y==N-2)/*人工控制找成功的話*/
yes=1; /*如果成功標志為1*/
}
void WayCopy(int (*oldmap)[N],int (*map)[N])/*拷貝迷宮數(shù)組 */
{
int i,j;
for(i=0;iN;i++)
for(j=0;jN;j++)
oldmap[i][j]=map[i][j];
}
int FindWay(int (*map)[N],int i,int j)/*遞歸找路*/
{
if(i==N-2j==N-2)/*走到出口*/
{
yes=1;/*標志為1,表示成功*/
return;
}
map[i][j]=1;/*走過的地方變?yōu)?*/
WayCopy(oldmap,map); /*拷貝迷宮圖*/
if(oldmap[i+1][j+1]==0!yes)/*判斷右下方是否可走*/
{
FindWay(oldmap,i+1,j+1);
if(yes)/*如果到達出口了,再把值賦給顯示路線的way數(shù)組,也正是這個原因,所以具體路線是從最后開始保存*/
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
WayCopy(oldmap,map);
if(oldmap[i+1][j]==0!yes)/*判斷下方是否可以走,如果標志yes已經是1也不用找下去了*/
{
FindWay(oldmap,i+1,j);
if(yes)
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
WayCopy(oldmap,map);
if(oldmap[i][j+1]==0!yes)/*判斷右方是否可以走*/
{
FindWay(oldmap,i,j+1);
if(yes)
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
WayCopy(oldmap,map);
if(oldmap[i-1][j]==0!yes)/*判斷上方是否可以走*/
{
FindWay(oldmap,i-1,j);
if(yes)
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
WayCopy(oldmap,map);
if(oldmap[i-1][j+1]==0!yes)/*判斷右上方是否可以走*/
{
FindWay(oldmap,i-1,j+1);
if(yes)
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
WayCopy(oldmap,map);
if(oldmap[i+1][j-1]==0!yes)/*判斷左下方是否可以走*/
{
FindWay(oldmap,i+1,j-1);
if(yes)
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
WayCopy(oldmap,map);
if(oldmap[i][j-1]==0!yes)/*判斷左方是否可以走*/
{
FindWay(oldmap,i,j-1);
if(yes)
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
WayCopy(oldmap,map);
if(oldmap[i-1][j-1]==0!yes)/*判斷左上方是否可以走*/
{
FindWay(oldmap,i-1,j-1);
if(yes)
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
return;
}
void MapRand(int (*map)[N])/*開始的隨機迷宮圖*/
{
int i,j;
cleardevice();/*清屏*/
randomize(); /*隨機數(shù)發(fā)生器*/
for(i=0;iN;i++)
{
for(j=0;jN;j++)
{
if(i==0||i==N-1||j==0||j==N-1)/*最外面一圈為墻壁*/
map[i][j]=1;
else
if(i==1j==1||i==N-2j==N-2)/*出發(fā)點與終點表示為可走的*/
map[i][j]=0;
else
map[i][j]=random(2);/*其它的隨機生成0或1*/
}
}
}
void PrMap(int (*map)[N])/*輸出迷宮圖*/
{
int i,j;
for(i=0;iN;i++)
for(j=0;jN;j++)
if(map[i][j]==0)
{
setfillstyle(SOLID_FILL,WHITE);/*白色為可走的路*/
bar(100+j*15-6,50+i*15-6,100+j*15+6,50+i*15+6);
}
else
{
setfillstyle(SOLID_FILL,BLUE);/*藍色為墻壁*/
bar(100+j*15-6,50+i*15-6,100+j*15+6,50+i*15+6);
}
}
void Find(void)/*找到通路*/
{
int i;
setfillstyle(SOLID_FILL,RED);/*紅色輸出走的具體路線*/
wayn--;
for(i=wayn;i=0;i--)
{
bar(100+way[i][1]*15-6,50+way[i][0]*15-6,100+
way[i][1]*15+6,50+way[i][0]*15+6);
sleep(1);/*控制顯示時間*/
}
bar(100+(N-2)*15-6,50+(N-2)*15-6,100+
(N-2)*15+6,50+(N-2)*15+6); /*在目標點標紅色*/
setcolor(GREEN);
settextstyle(0,0,2);/*設置字體大小*/
outtextxy(130,400,"Find a way!");
}
void NotFind(void)/*沒找到通路*/
{
setcolor(GREEN);
settextstyle(0,0,2);/*設置字體大小*/
outtextxy(130,400,"Not find a way!");
}
void Result(void)/*結果處理*/
{
if(yes)/*如果找到*/
Find();
else/*沒找到路*/
NotFind();
getch();
}
void Close(void)/*圖形關閉*/
{
closegraph();
}
#includestdio.h
#includestdlib.h
#define M 15
#define N 15
struct mark //定義迷宮內點的坐標類型
{
int x;
int y;
};
struct Element //"戀"棧元素,嘿嘿。。
{
int x,y; //x行,y列
int d; //d下一步的方向
};
typedef struct LStack //鏈棧
{
Element elem;
struct LStack *next;
}*PLStack;
/*************棧函數(shù)****************/
int InitStack(PLStack S)//構造空棧
{
S=NULL;
return 1;
}
int StackEmpty(PLStack S)//判斷棧是否為空
{
if(S==NULL)
return 1;
else
return 0;
}
int Push(PLStack S, Element e)//壓入新數(shù)據(jù)元素
{
PLStack p;
p=(PLStack)malloc(sizeof(LStack));
p-elem=e;
p-next=S;
S=p;
return 1;
}
int Pop(PLStack S,Element e) //棧頂元素出棧
{
PLStack p;
if(!StackEmpty(S))
{
e=S-elem;
p=S;
S=S-next;
free(p);
return 1;
}
else
return 0;
}
/***************求迷宮路徑函數(shù)***********************/
void MazePath(struct mark start,struct mark end,int maze[M][N],int diradd[4][2])
{
int i,j,d;int a,b;
Element elem,e;
PLStack S1, S2;
InitStack(S1);
InitStack(S2);
maze[start.x][start.y]=2; //入口點作上標記
elem.x=start.x;
elem.y=start.y;
elem.d=-1; //開始為-1
Push(S1,elem);
while(!StackEmpty(S1)) //棧不為空 有路徑可走
{
Pop(S1,elem);
i=elem.x;
j=elem.y;
d=elem.d+1; //下一個方向
while(d4) //試探東敗陪南西北各個方向
{
a=i+diradd[d][0];
b=j+diradd[d][1];
if(a==end.x b==end.y maze[a][b]==0) //如果到了出口
{
elem.x=i;
elem.y=j;
elem.d=d;
Push(S1,elem);
elem.x=a;
elem.y=b;
elem.d=886; //方向輸出為-1 判斷是否到了出口
Push(S1,elem);
printf("\n0=東 1=南 2=西 3=北 886為則走出迷宮\n\n通路畝掘為:(行坐標,列坐標,方向)\n");
while(S1) //逆置迅枯核序列 并輸出迷宮路徑序列
{
Pop(S1,e);
Push(S2,e);
}
while(S2)
{
Pop(S2,e);
printf("--(%d,%d,%d)",e.x,e.y,e.d);
}
return; //跳出兩層循環(huán),本來用break,但發(fā)現(xiàn)出錯,exit又會結束程序,選用return還是不錯滴
}
if(maze[a][b]==0) //找到可以前進的非出口的點
{
maze[a][b]=2; //標記走過此點
elem.x=i;
elem.y=j;
elem.d=d;
Push(S1,elem); //當前位置入棧
i=a; //下一點轉化為當前點
j=b;
d=-1;
}
d++;
}
}
printf("沒有找到可以走出此迷宮的路徑\n");
}
/*************建立迷宮*******************/
void initmaze(int maze[M][N])
{
int i,j;
int m,n; //迷宮行,列 [/M]
printf("請輸入迷宮的行數(shù) m=");
scanf("%d",m);
printf("請輸入迷宮的列數(shù) n=");
scanf("%d",n);
printf("\n請輸入迷宮的各行各列:\n用空格隔開,0代表路,1代表墻\n",m,n);
for(i=1;i=m;i++)
for(j=1;j=n;j++)
scanf("%d",maze[i][j]);
printf("你建立的迷宮為(最外圈為強)...\n");
for(i=0;i=m+1;i++) //加一圈圍墻
{
maze[i][0]=1;
maze[i][n+1]=1;
}
for(j=0;j=n+1;j++)
{
maze[0][j]=1;
maze[m+1][j]=1;
}
for(i=0;i=m+1;i++) //輸出迷宮
{
for(j=0;j=n+1;j++)
printf("%d ",maze[i][j]);
printf("\n");
}
}
void main()
{
int sto[M][N];
struct mark start,end; //start,end入口和出口的坐標
int add[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//行增量和列增量 方向依次為東西南北 [/M]
initmaze(sto);//建立迷宮
printf("輸入入口的橫坐標,縱坐標[逗號隔開]\n");
scanf("%d,%d",start.x,start.y);
printf("輸入出口的橫坐標,縱坐標[逗號隔開]\n");
scanf("%d,%d",end.x,end.y);
MazePath(start,end,sto,add); //find path
system("PAUSE");
}
#include \x0d\x0a#include \x0d\x0a#define M 15 \x0d\x0a#define N 15 \x0d\x0astruct mark //定義迷宮內點的坐標類型 \x0d\x0a{ \x0d\x0aint x; \x0d\x0aint y; \x0d\x0a}; \x0d\x0a\x0d\x0astruct Element //"戀"棧元素,嘿嘿。。 \x0d\x0a{ \x0d\x0aint x,y; //x行,y列 \x0d\x0aint d; //d下一步的方向 \x0d\x0a}; \x0d\x0a\x0d\x0atypedef struct LStack //鏈棧 \x0d\x0a{ \x0d\x0aElement elem; \x0d\x0astruct LStack *next; \x0d\x0a}*PLStack; \x0d\x0a\x0d\x0a/*************棧函數(shù)****************/ \x0d\x0a\x0d\x0aint InitStack(PLStack S)//構造空棧 \x0d\x0a{ \x0d\x0aS=NULL; \x0d\x0areturn 1; \x0d\x0a} \x0d\x0a\x0d\x0aint StackEmpty(PLStack S)//判斷棧是否為空 \x0d\x0a{ \x0d\x0aif(S==NULL) \x0d\x0areturn 1; \x0d\x0aelse \x0d\x0areturn 0; \x0d\x0a} \x0d\x0a\x0d\x0aint Push(PLStack S, Element e)//壓入新數(shù)據(jù)元素 \x0d\x0a{ \x0d\x0aPLStack p; \x0d\x0ap=(PLStack)malloc(sizeof(LStack)); \x0d\x0ap-elem=e; \x0d\x0ap-next=S; \x0d\x0aS=p; \x0d\x0areturn 1; \x0d\x0a} \x0d\x0a\x0d\x0aint Pop(PLStack S,Element e) //棧頂元素出棧 \x0d\x0a{ \x0d\x0aPLStack p; \x0d\x0aif(!StackEmpty(S)) \x0d\x0a{ \x0d\x0ae=S-elem; \x0d\x0ap=S; \x0d\x0aS=S-next; \x0d\x0afree(p); \x0d\x0areturn 1; \x0d\x0a} \x0d\x0aelse \x0d\x0areturn 0; \x0d\x0a} \x0d\x0a\x0d\x0a/***************求迷宮路徑鋒雹函數(shù)***********************/ \x0d\x0avoid MazePath(struct mark start,struct mark end,int maze[M][N],int diradd[4][2]) \x0d\x0a{ \x0d\x0aint i,j,d;int a,b; \x0d\x0aElement elem,e; \x0d\x0aPLStack S1, S2; \x0d\x0aInitStack(S1); \x0d\x0aInitStack(S2); \x0d\x0amaze[start.x][start.y]=2; //入口點作上標記 \x0d\x0aelem.x=start.x; \x0d\x0aelem.y=start.y; \x0d\x0aelem.d=-1; //開始為-1 \x0d\x0aPush(S1,elem); \x0d\x0awhile(!StackEmpty(S1)) //棧不為空 有路徑可走 \x0d\x0a{ \x0d\x0aPop(S1,elem); \x0d\x0ai=elem.x; \x0d\x0aj=elem.y; \x0d\x0ad=elem.d+1; //下一個方向 \x0d\x0awhile(d(%d,%d,%d)",e.x,e.y,e.d); \x0d\x0a} \x0d\x0areturn; //跳出兩層循環(huán),本來乎基衫用break,但發(fā)現(xiàn)出錯,exit又會歲腔結束程序,選用return還是不錯滴\x0d\x0a} \x0d\x0aif(maze[a][b]==0) //找到可以前進的非出口的點 \x0d\x0a{ \x0d\x0amaze[a][b]=2; //標記走過此點 \x0d\x0aelem.x=i; \x0d\x0aelem.y=j; \x0d\x0aelem.d=d; \x0d\x0aPush(S1,elem); //當前位置入棧 \x0d\x0ai=a; //下一點轉化為當前點 \x0d\x0aj=b; \x0d\x0ad=-1; \x0d\x0a} \x0d\x0ad++; \x0d\x0a} \x0d\x0a} \x0d\x0aprintf("沒有找到可以走出此迷宮的路徑\n"); \x0d\x0a} \x0d\x0a\x0d\x0a/*************建立迷宮*******************/ \x0d\x0avoid initmaze(int maze[M][N]) \x0d\x0a{ \x0d\x0aint i,j; \x0d\x0aint m,n; //迷宮行,列 [/M] \x0d\x0a\x0d\x0aprintf("請輸入迷宮的行數(shù) m="); \x0d\x0ascanf("%d",m); \x0d\x0aprintf("請輸入迷宮的列數(shù) n="); \x0d\x0ascanf("%d",n); \x0d\x0aprintf("\n請輸入迷宮的各行各列:\n用空格隔開,0代表路,1代表墻\n",m,n); \x0d\x0afor(i=1;i
回答于?2022-11-16
新聞標題:c語言迷宮地圖函數(shù) c語言迷宮問題求解
URL鏈接:http://jinyejixie.com/article4/ddpieoe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、企業(yè)建站、Google、網(wǎng)站內鏈、網(wǎng)站建設、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)