c語言老鼠走迷宮
1. 誰能用非遞歸演算法解決老鼠走迷宮問題我要源程序.!!!
#include<iostream>
#include<string>
#include<ctime>
#include<cstring>
usingnamespacestd;
structcoordinate
{
intx,y;
intdir;
};
classstack
{
public:
coordinate*c;
intMaxSize;
inttop;
stack(int);
voidPush(constcoordinate&);
coordinatePop();
boolempty();
voidOutput();
};
stack::stack(intms)
{
if(ms<=0){cerr<<"invalidms"<<endl;exit(1);}
MaxSize=ms;
c=newcoordinate[MaxSize];
if(!c)
{
cerr<<"memoryallocationfailure"<<endl;
exit(1);
}
top=-1;
}
voidstack::Push(constcoordinate&coor)
{
if(top==MaxSize)
{
cerr<<"stackoverflow"<<endl;
exit(1);
}
top++;
c[top]=coor;
}
coordinatestack::Pop()
{
if(top==-1)
{
cerr<<"stackisempty"<<endl;
exit(1);
}
top--;
returnc[top+1];
}boolstack::empty()
{
returntop==-1;
}
voidstack::Output()
{
while(!empty())
{
cout<<c[top].x<<''<<c[top].y<<endl;
top--;
}
}
intmain()
{
clock_tt1,t2,t3;
t1=clock();
inti,j,m,n,M,N,k,f;
cin>>M>>N>>i>>j>>m>>n;
stackS(M*N),R(M*N);
boolMazepath(char**,int**,int,int,int,int,int,int,stack,stack);
intmazePath(char**,int**,int,int,int,int,int,int,stack);
cin.ignore();
int**mark=newint*[M+1];
char**maze=newchar*[M+1];
for(k=0;k<M;k++)
{
maze[k]=newchar[N+1];
mark[k]=newint[N+1];
}
for(k=0;k<M;k++)cin.getline(maze[k],N+1,' ');
for(k=0;k<M;k++)
for(f=0;f<N;f++)mark[k][f]=0;
t3=clock();
Mazepath(maze,mark,M,N,i,j,m,n,R,S);
//mazePath(maze,mark,M,N,i,j,m,n,S);
t2=clock();
cerr<<(double)(t3-t1)/CLK_TCK<<endl;
cerr<<(double)(t2-t3)/CLK_TCK;
for(k=0;k<M;k++)delete[]maze[k];
delete[]maze;
for(k=0;k<M;k++)delete[]mark[k];
delete[]mark;
delete[]S.c;
}
intmazePath(char**maze,int**mark,intM,intN,inti,intj,intm,intn,stackS)
{
coordinatecoor={i,j,0};
intg,h;
intmove[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
while((!S.empty())||(coor.dir!=3))
{
g=coor.x+move[coor.dir][0];
h=coor.y+move[coor.dir][1];
if((g==m)&&(h==n)&&(maze[g][h]=='0'))
{
S.Push(coor);
coor.x=m;coor.y=n;coor.dir=0;
S.Push(coor);
while(!S.empty())S.Output();
return1;
}
elseif((mark[g][h]==0)&&(maze[g][h]=='0'))
{
mark[g][h]=1;
S.Push(coor);
coor.x=g;coor.y=h;coor.dir=0;
}
else
{
if(coor.dir<3)coor.dir++;
else
{
while((coor.dir==3)&&(!S.empty()))coor=S.Pop();
}
}
}
cerr<<"nopath"<<endl;
return0;
}
2. c語言老鼠走迷宮問題
哥們,多點分,估計還有人給你搞,就這點分誰給你整,再說還是個程序! 
從網上給你搜了一個,試試行不行。 
#include<stdio.h> 
#include<stdlib.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; 
/*************棧函數****************/ 
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)//壓入新數據元素 
{ 
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; 
} 
/***************求迷宮路徑函數***********************/ 
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(d<4) //試探東南西北各個方向 
{ 
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; //跳出兩層循環,本來用break,但發現出錯,exit又會結束程序,選用return還是不錯滴o(∩_∩)o... 
} 
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; //迷宮行,列 
printf("請輸入迷宮的行數 m="); 
scanf("%d",&m); 
printf("請輸入迷宮的列數 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("你建立的迷宮為o(∩_∩)o...\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}};//行增量和列增量 方向依次為東西南北 
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"); 
}
3. 數據結構 c語言 課程設計 小鼠走迷宮問題
1、可以用「*」來代表老鼠,「|」來代表牆,空格來代表路。每走一步用system("cls")刷新一次屏幕。
2、牆不可穿過代表,牆與周圍的格子沒有邊。
3、規定一個時間t,若在t步之內沒有走到糧倉,則輸出無解。
4、這個簡單,無非就是修改條件,從而修改整個圖。
5、所用路徑可以用深搜(回朔)來解決,最短路就用廣搜來解決。最短路也可以用Dijstra演算法、floyd演算法等,但廣搜是最簡單的。
具體的程序你自己實現吧,如果寫不出來,就去請教一下你們學校的ACMer,他們應該會比較熟悉。加油吧。
4. 怎麼編寫老鼠走迷宮游戲
菜單欄上點「項目」,選擇「屬性」,選擇「配置屬性」,選擇「常規」,編碼方式改為「多位元組」,也就是multibytes,系統默認是Unicode,所以會報這個錯。
 
老鼠走迷宮你是想要怎麼樣的,詳細要求說清楚點,還有,這么點分,怕是沒人願意做,寫一個大的工程,至少200分才說的過去嘛,要寫代碼,調試,很耗時間的,大哥。
5. 跪求老鼠走迷宮游戲,必須用C++編寫,用棧來實現,因為是數據結構課程設計所以只要現成代碼,越快越好。
#include "stdafx.h"
#include <stack>
using namespace std;
const int rows = 8,cols = 8;
HINSTANCE hInst;
HBITMAP ball;
HDC hdc,mdc,bufdc;
HWND hWnd;
DWORD tPre,tNow;
char *str;
int nowPos,prePos;
bool find;
stack<int> path;
int mapIndex[rows*cols] = { 0,2,0,0,0,0,0,0, //材1
0,1,0,1,1,1,1,0, //材2
0,1,0,1,0,1,1,0, //材3
0,1,0,0,0,1,1,0, //材4
0,1,1,1,1,1,1,0, //材5
0,1,0,0,0,0,1,0, //材6
0,0,1,1,1,1,1,0, //材7
0,0,0,0,0,0,3,0 }; //材8
int record[rows*cols];
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void MyPaint(HDC hdc);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
tNow = GetTickCount();
if(tNow-tPre >= 100)
MyPaint(hdc);
}
}
return msg.wParam;
}
//****注冊窗口*************************
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "canvas";
wcex.hIconSm = NULL;
return RegisterClassEx(&wcex);
}
//****初始化*************************************
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HBITMAP bmp;
hInst = hInstance;
hWnd = CreateWindow("canvas", "迷宮" , WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
MoveWindow(hWnd,10,10,430,450,true);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
hdc = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc);
bufdc = CreateCompatibleDC(hdc);
bmp = CreateCompatibleBitmap(hdc,cols*50,rows*50);
SelectObject(mdc,bmp);
HBITMAP tile;
int rowNum,colNum;
int i,x,y;
tile = (HBITMAP)LoadImage(NULL,"tile.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);
ball = (HBITMAP)LoadImage(NULL,"ball.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);
for (i=0;i<rows*cols;i++)
{
record[i] = mapIndex[i];
rowNum = i / cols;
colNum = i % cols;
x = colNum * 50;
y = rowNum * 50;
SelectObject(bufdc,tile);
if(!mapIndex[i])
BitBlt(mdc,x,y,50,50,bufdc,0,0,SRCCOPY);
else
{
if(mapIndex[i] == 2)
{
nowPos = i;
path.push(i);
record[i] = 0;
}
BitBlt(mdc,x,y,50,50,bufdc,0,0,WHITENESS);
}
}
prePos = cols * rows + 1;
MyPaint(hdc);
return TRUE;
}
//****核心代碼*********************************
void MyPaint(HDC hdc)
{
int rowNum,colNum;
int x,y;
int up,down,left,right;
rowNum = prePos / cols;
colNum = prePos % cols;
x = colNum * 50;
y = rowNum * 50;
SelectObject(bufdc,ball);
BitBlt(mdc,x,y,50,50,bufdc,0,0, WHITENESS);
rowNum = nowPos / cols;
colNum = nowPos % cols;
x = colNum * 50;
y = rowNum * 50;
SelectObject(bufdc,ball);
BitBlt(mdc,x,y,50,50,bufdc,0,0, SRCCOPY);
if(!find)
{
str = "迷宮入口";
up = nowPos - cols;
down = nowPos + cols;
left = nowPos - 1;
right = nowPos + 1;
if(up>=0 && record[up])
{
path.push(up);
record[up] = 0;
prePos = nowPos;
nowPos = up;
if(mapIndex[nowPos] == 3)
find = true;
}
else if(down<=cols*rows-1 && record[down])
{
path.push(down);
record[down] = 0;
prePos = nowPos;
nowPos = down;
if(mapIndex[nowPos] == 3)
find = true;
}
else if(left>=rowNum*cols && record[left])
{
path.push(left);
record[left] = 0;
prePos = nowPos;
nowPos = left;
if(mapIndex[nowPos] == 3)
find = true;
}
else if(right<=(rowNum+1)*cols-1 && record[right])
{
path.push(right);
record[right] = 0;
prePos = nowPos;
nowPos = right;
if(mapIndex[nowPos] == 3)
find = true;
}
else
{
if(path.size() <= 1) //
str = "xxxxx";
else
{
path.pop();
prePos = nowPos;
nowPos = path.top();
}
}
}
else
{
str = "找到出口";
}
TextOut(mdc,0,0,str,strlen(str));
BitBlt(hdc,10,10,cols*50,rows*50,mdc,0,0,SRCCOPY);
tPre = GetTickCount();
}
//****消息函數***********************************
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_KEYDOWN:
if(wParam==VK_ESCAPE)
PostQuitMessage(0);
break;
case WM_DESTROY:
DeleteDC(mdc);
DeleteDC(bufdc);
DeleteObject(ball);
ReleaseDC(hWnd,hdc);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

6. 走迷宮的C語言版代碼求助 程序開始運行時顯示一個迷宮地圖,迷宮中央有一隻老鼠,迷宮的右下方有一個糧
/*註:本程序探索迷宮的優先順序=>  1-下、2-右、3-上、4-左  <=總體趨勢:下右,逆時針方向。因為出口就在右邊下方*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define stack_init_size 200
#define stack_increment 10
#define OVERFLOW 0
#define OK 1
#define ERROE 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef struct{
 int x;
 int y;
}PosType;
typedef struct {
 int ord; // 通道塊在路徑上的"序號"
 PosType seat; //通道塊在迷宮中的"坐標位置"
 int di;   //從此通道塊走向下一通道塊的"方向"
}SElemType;
typedef struct{
 SElemType *base;
 SElemType *top;
 int stacksize;
}SqStack;
int mg[20][20];
/*隨機生成迷宮的函數
/*為了能夠讓盡量能通過,將能通過的塊和不能通過的塊數量比大致為2:1*/
void Random(){
 int i,j,k;
 srand(time(NULL));
 mg[1][0]=mg[1][1]=mg[18][19]=0; //將入口、出口設置為"0"即可通過
 for(j=0;j<20;j++)
  mg[0][j]=mg[19][j]=1;  /*設置迷宮外圍"不可走",保證只有一個出口和入口*/
 for(i=2;i<19;i++)
  mg[i][0]=mg[i-1][19]=1;  /*設置迷宮外圍"不可走",保證只有一個出口和入口*/
 for(i=1;i<19;i++)
  for(j=1;j<19;j++){
   k=rand()%3; //隨機生成0、1、2三個數
   if(k)
    mg[i][j]=0;
   else{
    if((i==1&&j==1)||(i==18&&j==18)) /*因為距入口或出口一步的路是必經之路,故設該通道塊為"0"加大迷宮能通行的概率*/
     mg[i][j]=0;
    else 
     mg[i][j]=1;
   }
  }  
}
//構造一個空棧
Status InitStack(SqStack &s){
 s.base =(SElemType *)malloc(stack_init_size * sizeof(SElemType));
 if(!s.base) return OVERFLOW;
 s.top=s.base;
 s.stacksize=stack_init_size;
 return OK;
}
//當前塊可否通過
Status Pass(PosType e){
 if (mg[e.x][e.y]==0)  //0時可以通過  
  return OK;  // 如果當前位置是可以通過,返回1
 return OVERFLOW; // 其它情況返回0
}
//留下通過的足跡
Status FootPrint(PosType e){
 mg[e.x][e.y]=7;
 return OK;
}
//壓入棧
Status Push(SqStack &s,SElemType e){
 if(s.top-s.base>=s.stacksize){
  s.base=(SElemType *)realloc(s.base,(s.stacksize+stack_increment) *sizeof(SElemType));
 if(!s.base)exit(OVERFLOW);
 s.top=s.base+s.stacksize;
 s.stacksize+=stack_increment;
 }
 *s.top++=e;
 return OK;
}
//出棧
Status Pop(SqStack &s,SElemType &e){
 if(s.top==s.base)
  return ERROE;
 e=*--s.top;
 return OK;
}
//下一步
PosType NextPos(PosType &e,int dir){
 PosType E;
 switch(dir){
 case 1:E.x=e.x;  //向下
     E.y=e.y+1;
     break;
 case 2:E.x=e.x+1; //向右
     E.y=e.y;
     break;
    case 3:E.x=e.x;  //向上
     E.y=e.y-1;
     break;
 case 4:E.x=e.x-1; //向左
     E.y=e.y;
     break;
 }
 return E;
}
//是否空棧
Status StackEmpty(SqStack s){
 if (s.top==s.base)  
  return OK;
 return OVERFLOW;  
}
//留下不能通過的足跡
Status MarkPrint(PosType e){ 
 mg[e.x][e.y]=3;
 return OK;
}
//迷宮函數
// 若迷宮maze中從入口 start到出口 end的通道,則求得一條存放在棧中
// (從棧底到棧頂),並返回TRUE;否則返回FALSE
Status MazePath(int mg,PosType start,PosType end,SqStack &s){
 PosType curpos;
 InitStack(s);
 SElemType e; 
 int curstep; 
 curpos=start; // 設定"當前位置"為"入口位置"
 curstep=1;  // 探索第一步
 do{ 
  if(Pass(curpos)){ // 當前位置可通過,即是未曾走到過的通道塊
   FootPrint(curpos); // 留下足跡
   e.di =1;
            e.ord = curstep;
            e.seat= curpos;
   Push(s,e); // 加入路徑
   if(curpos.x==end.x&&curpos.y==end.y){
    printf("\n\n0∩_∩0 能到達終點!");
    return TRUE;
   }
   curpos=NextPos(curpos,1); // 下一位置是當前位置的東鄰
   curstep++;  // 探索下一步
  }
  else{ // 當前位置不能通過
   if(!StackEmpty(s)){
    Pop(s,e);
    while(e.di==4&&!StackEmpty(s)){
     MarkPrint(e.seat);
     Pop(s,e);
    }
    if(e.di<4){
     e.di++;
     Push(s,e); // 留下不能通過的標記,並退回一步
     curpos=NextPos(e.seat,e.di); /* 當前位置設為新方向的相鄰塊*/
    }//if
   }//if
  }//else
 }while(!StackEmpty(s));
 printf("\n\n囧 ! 不能到達終點!");
 return FALSE;
}
//列印迷宮
void PrintMaze(){
  int i,j;
  printf("運行路徑:\n\n");
  for(i=0;i<20;i++){
  for(j=0;j<20;j++){
   if(mg[i][j]==0)printf("  ");
   else if(mg[i][j]==1) printf("■");  //迷宮的"牆"
   else if(mg[i][j]==3) printf("◇");      //不通的路
   else if(mg[i][j]==7)printf("○");  //通過的路徑
  }    
  printf("\n");
 }
  printf("\n");
}
void main(){
 SqStack S;
 PosType start,end;
 start.x=1;start.y=0; //起點坐標 
 end.x=18;end.y=19; //終點坐標
 printf("\n==================迷宮游戲==================");
 printf("\n說明:■不能走的區域\t◇走不通的區域");
 printf("\n    '空格'代表未到過的區域");
 printf("\n     ○代表能通過的路徑,指向終點");
 printf("\n============================================");
 Random();
 printf("\n\nTest 1:");
    MazePath(mg[20][20],start,end,S);
    PrintMaze();
 system("pause");
 Random();
 printf("\nTest 2:");
    MazePath(mg[20][20],start,end,S);
    PrintMaze();
 system("pause");
 Random();
 printf("\nTest 3:");
    MazePath(mg[20][20],start,end,S);
    PrintMaze();
 printf("\n==========程序退出,感謝使用!==========\n");
}
7. 關於C++老鼠走迷宮
哥們,多點分,估計還有人給你搞,就這點分誰給你整,再說還是個程序! 
從網上給你搜了一個,試試行不行。 
#include<stdio.h> 
#include<stdlib.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; 
/*************棧函數****************/ 
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)//壓入新數據元素 
{ 
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; 
} 
/***************求迷宮路徑函數***********************/ 
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(d<4) //試探東南西北各個方向 
{ 
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; //跳出兩層循環,本來用break,但發現出錯,exit又會結束程序,選用return還是不錯滴o(∩_∩)o... 
} 
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; //迷宮行,列 
printf("請輸入迷宮的行數 m="); 
scanf("%d",&m); 
printf("請輸入迷宮的列數 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("你建立的迷宮為o(∩_∩)o...\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]=,,,};//行增量和列增量 方向依次為東西南北 
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"); 
}
8. C語言 老鼠走迷宮
每走過一個點,要把走過的點的坐標由0改成其他值,如2,這樣就不會在朝回走,造成循環了,嘿嘿,我寫的如下:
#include<stdio.h>
#include<stdlib.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;
/*************棧函數****************/
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)//壓入新數據元素
{              
 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;
}
/***************求迷宮路徑函數***********************/
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(d<4)   //試探東南西北各個方向
        {
         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;   //跳出兩層循環,本來用break,但發現出錯,exit又會結束程序,選用return還是不錯滴o(∩_∩)o...
          }
         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;   //迷宮行,列
                                              
 printf("請輸入迷宮的行數 m=");
 scanf("%d",&m);
 printf("請輸入迷宮的列數 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("你建立的迷宮為o(∩_∩)o...\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}};//行增量和列增量 方向依次為東西南北
 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");
}
9. C語言數據結構 老鼠走迷宮問題
/*   迷宮矩陣
1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 1 0 0 0 1
1 1 1 0 0 1 0 1 0 1
1 0 0 0 1 0 0 0 0 1
1 0 0 0 0 1 0 1 0 1
1 1 0 1 0 0 0 0 0 1
1 0 0 1 1 1 0 1 1 1
1 1 0 0 0 1 0 0 0 1
1 1 1 1 1 1 1 1 1 1
*/
#include<stdio.h>
#define  m  7
#define  n  8
void path()
{
 int maze[m+2][n+2] ;
 int move[4][2]={ {0,-1},{-1,0},{0,1},{1,0} };
 int s[54][3];
 int top=0;
 int i,j,k,f=0;
 int g,h,p;
 for(i=0;i<m+2;++i)
  for(j=0;j<n+2;++j)
   scanf("%d",&maze[i][j]);
 maze[1][1]=2;
 s[top][0]=1;
 s[top][1]=1;
 s[top][2]=0;
 ++top;
 while(top!=0&&f==0)
 {
  --top;
  i=s[top][0];
  j=s[top][1];
  k=s[top][2];
  while(k<4)
  {
   g=i+move[k][0];
   h=j+move[k][1];
   if(g==m&&h==n&&maze[g][h]==0)
   {
    for(p=0;p<top;++p)
     printf("%3d,%d\n",s[p][0],s[p][1]);
    printf("%3d,%d\n",i,j);
    printf("%3d,%d\n",m,n);
    f=1;
   }//if
   if(maze[g][h]==0)
   {
    maze[g][h]=2;
    s[top][0]=i;
    s[top][1]=j;
    s[top][2]=k;
    ++top;
    i=g;
    j=h;
    k=0;
   }//if
   k=k+1;
  }//while
 }//while
 if(f==0)
  printf("no path\n");
}//pathvoid main()
{
 path();
}
10. C語言老鼠走迷宮問題
從程序上來看   也就是說在調用這個visit函數時,如果maze[i][j]這個點的上下左右都不是0的話 也就是進入了死胡同  那麼就把這個點置為0。
你可以把這個程序這樣子改一下,
 if(visit(startI, startJ) == 0)
    {
       printf("\n沒有找到出口!\n"); 
        printf("\n顯示路徑:\n"); 
        for(i = 0; i < 7; i++) { 
            for(j = 0; j < 7; j++) { 
                if(maze[i][j] == 2) 
                    printf("█"); 
                else if(maze[i][j] == 1) 
                    printf("◇"); 
                else 
                    printf("  "); 
            }
else
  {
       printf("\n顯示路徑:\n"); 
       for(i = 0; i < 7; i++) { 
           for(j = 0; j < 7; j++) { 
               if(maze[i][j] == 2) 
                   printf("█"); 
               else if(maze[i][j] == 1) 
                   printf("◇"); 
               else 
                   printf("  "); 
           } 
           printf("\n"); 
這樣對你調試程序和理解程序都有幫助,希望對你有用。
