c語言的迷宮問題

//尋路_帶權重_帶障礙_最短_文件地圖_不閃------wlfryq------//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>

typedefstruct
{
intx;
inty;
}_PT;

_PTpt;
introw=0,col=0;

//設置CMD窗口游標位置
voidsetxy(intx,inty)
{
COORDcoord={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
//獲取當前CMD當前游標所在位置
voidgetxy()
{
HANDLEhConsole=GetStdHandle(STD_OUTPUT_HANDLE);
COORDcoordScreen={0,0};//游標位置
CONSOLE_SCREEN_BUFFER_INFOcsbi;
if(GetConsoleScreenBufferInfo(hConsole,&csbi))
{
pt.x=csbi.dwCursorPosition.X;
pt.y=csbi.dwCursorPosition.Y;
}
}

typedefstruct
{
intx;
inty;
inttype;
intv;
}PT;

PT**s=NULL,stack[50],start,end,c;
intpos=0;

voidprt()
{
inti,j;
system("cls");
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
if(s[i][j].type==1)
{
printf("■");
}
elseif(i==end.x&&j==end.y)
{
printf("★");
}
elseif(i==c.x&&j==c.y)
{
printf("◎");
}
else
{
printf("");
}
}
printf(" ");
}
Sleep(500);
}

voidstack_in(PTa)
{
stack[pos++]=a;
}

PTstack_out()
{
inti;
PTt;
t=stack[0];
for(i=0;i<pos-1;i++)
{
stack[i]=stack[i+1];
}
pos--;
returnt;
}

voidfun()
{
PTa;
intx,y,v;
while(1)
{
if(pos==0)
{
break;
}
a=stack_out();
x=a.x;
y=a.y;
if(x==start.x&&y==start.y)
{
break;
}
v=s[x][y].v;
if(x-1>=0&&s[x-1][y].type==0&&(s[x-1][y].v==-1||s[x-1][y].v>v+1))
{
s[x-1][y].v=v+1;
stack_in(s[x-1][y]);
}
if(x+1<=row-1&&s[x+1][y].type==0&&(s[x+1][y].v==-1||s[x-1][y].v>v+1))
{
s[x+1][y].v=v+1;
stack_in(s[x+1][y]);
}
if(y-1>=0&&s[x][y-1].type==0&&(s[x][y-1].v==-1||s[x-1][y].v>v+1))
{
s[x][y-1].v=v+1;
stack_in(s[x][y-1]);
}
if(y+1<=col-1&&s[x][y+1].type==0&&(s[x][y+1].v==-1||s[x-1][y].v>v+1))
{
s[x][y+1].v=v+1;
stack_in(s[x][y+1]);
}
}
}

voidgo(intx,inty)
{
printf(" 按任意鍵開始 ");
getchar();
intv;
while(1)
{
if(x==end.x&&y==end.y)
{
setxy(0,y+2);
printf("end....");
return;
}
v=s[x][y].v;
if(v==0)
{
return;
}
if(x-1>=0&&s[x-1][y].v==v-1)
{
c=s[x-1][y];
setxy(y*2,x);
x=x-1;
printf("");
setxy(y*2,x);
printf("◎");
Sleep(500);
continue;
}
elseif(x+1<=row-1&&s[x+1][y].v==v-1)
{
c=s[x+1][y];
setxy(y*2,x);
x++;
printf("");
setxy(y*2,x);
printf("◎");
Sleep(500);
continue;
}
elseif(y-1>=0&&s[x][y-1].v==v-1)
{
c=s[x][y-1];
setxy(y*2,x);
y--;
printf("");
setxy(y*2,x);
printf("◎");
Sleep(500);
continue;
}
elseif(y+1<=col-1&&s[x][y+1].v==v-1)
{
c=s[x][y+1];
setxy(y*2,x);
y++;
printf("");
setxy(y*2,x);
printf("◎");
Sleep(500);
continue;
}
}
printf(" returngo ");
system("pause");
}

voidGetMapFromFile()
{
inti,j,x,y,len;
charch[50]={''};
FILE*fp=fopen("e:\map1.txt","r");
if(fp==NULL)
{
printf("openfilefailed. ");
return;
}
x=0;

while(!feof(fp))
{
fgets(ch,50,fp);
row++;
}
col=strlen(ch);
fseek(fp,0L,SEEK_SET);
while(!feof(fp))
{
fgets(ch,50,fp);
if(s==NULL)
{
len=strlen(ch);
for(i=len-1;i>0;i--)
{
if(ch[i]!='0'&&ch[i]!='1')
{
ch[i]='';
}
else
{
break;
}
}
len=strlen(ch);
s=(PT**)malloc(sizeof(PT*)*row);
for(j=0;j<len;j++)
{
*(s+j)=(PT*)malloc(sizeof(PT)*len);
}
}
y=0;
for(i=0;i<len;i++)
{
s[x][y].type=ch[i]-48;
s[x][y].x=x;
s[x][y].y=y;
s[x][y].v=-1;
y++;
}
x++;
}
start=s[row-2][1];
end=s[row-2][len-2];
fclose(fp);
}

intmain()
{
GetMapFromFile();
inti,j;
intx,y;
x=end.x;
y=end.y;
s[x][y].v=0;
stack_in(end);
fun();
c=start;
prt();
go(start.x,start.y);
return0;
}

⑵ c語言 迷宮問題

1是路徑還是0是路徑?
#include<cstdio>
#include<cstdlib>
enum se{
path,
block,
end,
mark
};
struct way{
int x;
int y;
}record[1000];
int maze[14][28]={
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,
1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,1,1,0,0,1,
1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,1,1,0,1,1,1,1,0,1,
1,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,0,0,0,1,1,0,1,1,1,1,0,1,
1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,1,1,0,0,1,1,0,0,1,
1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
void set_end(int ex, int ey){ //設置結束
maze[ex][ey] = end;
}
void printMaze(){
for(int i=0;i<14;i++) //迷宮圖形化輸出
{
for(int j=0;j<28;j++)
{
if(maze[i][j] == block)
printf("■");
else printf("□");
}
printf("\n");
}
}
void printResult(int length){
for(int i = 0; i < 14; i++) //迷宮路徑圖形化輸出
{
for(int j = 0; j < 28; j++)
{
if(maze[i][j] == mark)
printf(">>");
else if(maze[i][j] == block)
printf("■");
else if(maze[i][j] == end)
printf("<<");
else if(maze[i][j] == path)
printf("□");
}
printf("\n");
}
for(int x = 0; x < length - 1; x++){
printf("<%d,%d> ->", record[x].x, record[x].y);
}
printf("<%d,%d> ", record[x].x, record[x].y);
printf("\n");
}
void search_path(int x, int y, int length){ // 遞歸尋找路徑
if(maze[x][y] == end){
printResult(length);
system("pause");
exit(0);
}
else{
if(maze[x + 1][y] != block && maze[x + 1][y] != mark){
maze[x][y] = mark;
record[length].x = x;
record[length].y = y;
length++;
search_path(x + 1, y, length);
maze[x][y] = path;
length --;
}
if(maze[x - 1][y] != block && maze[x - 1][y] != mark){
maze[x][y] = mark;
record[length].x = x;
record[length].y = y;
length++;
search_path(x - 1, y, length);
maze[x][y] = path;
length --;
}
if(maze[x][y + 1] != block && maze[x][y + 1] != mark){
maze[x][y] = mark;
record[length].x = x;
record[length].y = y;
length++;
search_path(x, y + 1, length);
maze[x][y] = path;
length --;
}
if(maze[x][y - 1] != block && maze[x][y - 1] != mark){
maze[x][y] = mark;
record[length].x = x;
record[length].y = y;
length++;
search_path(x, y - 1, length);
maze[x][y] = path;
length --;
}
return;
}
}

int main(void)
{
set_end(12,26);
printMaze();
search_path(1,5,0);
printf("no path!"); //沒有路徑
return 0;
}

⑶ C語言 用隊列求解迷宮問題

#include <stdio.h>
#define Maxsize 100
#define N 10
int M[N+2][N+2]=
{
{1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,1,0,1,0,1,0,0,1},
{1,0,0,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,1,0,0,1},
{1,0,1,1,1,1,1,1,1,0,1,1},
{1,0,0,0,0,1,1,0,1,0,0,1},
{1,1,0,1,0,0,0,0,1,0,1,1},
{1,0,0,1,1,0,1,0,0,0,0,1},
{1,0,1,1,0,0,0,1,1,1,1,1},
{1,0,0,0,0,1,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1}
};
struct path
{
int i,j,p;
}Q[Maxsize];
int front=-1;
int rear=-1;
void print(int front)
{
int k=front,i=0,j;
while(k!=0)
{
j=k;
k=Q[k].p;
Q[j].p=-1;
}
printf("迷宮最快捷路徑如下:\n");
k=0;
while(k<Maxsize)
{
if(Q[k].p==-1)
{
i++;
printf("{%d,%d}\t",Q[k].i,Q[k].j);
M[Q[k].i][Q[k].j]=0;
if(i%5==0)
printf("\n");
}
k++;
}
printf("\n迷宮最快捷路徑如圖所示:\n");
for(i=0;i<12;i++)
{
for(j=0;j<12;j++)
{
if(M[i][j]==-1)
printf("%c%c",161,245);
else if(M[i][j]==0)
printf("%c%c",161,242);
else
printf("%c%c",161,246);
}
printf("\n");
}
}

int labyrinth(int x1,int y1,int x2,int y2)
{
int i,j,find=0,di;
rear++;
Q[rear].i=x1;Q[rear].j=y1;Q[rear].p=-1;
M[1][1]=-1;
while(front<=rear&&find==0)
{
front++;
i=Q[front].i;j=Q[front].j;
if(i==x2&&j==y2)
{
find=1;
print(front);
return 1;
}
for(di=0;di<4;di++)
{
switch(di)
{
case 0:
i=Q[front].i-1;j=Q[front].j;break;
case 1:
i=Q[front].i;j=Q[front].j+1;break;
case 2:
i=Q[front].i+1;j=Q[front].j;break;
case 3:
i=Q[front].i;j=Q[front].j-1;break;
}
if(M[i][j]==0)
{
rear++;
Q[rear].i=i;Q[rear].j=j;Q[rear].p=front;
M[i][j]=-1;
}
}
}
return 0;
}
void main()
{
labyrinth(1,1,N,N);
}

在vc上運行

⑷ 數據結構C語言版的迷宮問題如何解決

//迷宮實現 。。。

#include<iostream>
using namespace std;
class Stack
{
public:
void clear();
bool push(const int item);
bool pop(int & item);
bool Top(int & item);
bool isEmpty();
bool isFull();
};

class arrStack: public Stack
{
private:
int mSize;
int top;
int *st;
public:
arrStack(int size)
{
mSize=size;
top=-1;
st=new int[mSize];

}
arrStack()
{
top=-1;
}

~arrStack()
{
delete []st;
}

void clear()
{
top=-1;
}

bool isEmpty()
{
if(top==-1)
return true;
else
return false;
}

bool push(const int item)
{
if(top==mSize-1)
{
cout<<"棧滿溢出。。。"<<endl;
return false;

}
else
{
st[++top]=item;
return true;
}
}

bool pop(int &item)
{
if(top==-1)
{
cout<<"棧空。。。"<<endl;
return false;
}

else
{
item=st[top--];
return true;
}

}

bool Top(int &item)
{
if(top==-1)
{
cout<<"棧空,不能讀取棧頂元素。。。"<<endl;
return false;
}
else
{
item=st[top];
return true;
}
}
};

void main()
{

arrStack ly(100);
int i=1,j=1,cur,m,n;
int a[9][9];
while(i==0||j==0)
{
a[i][j]=0; // =0為牆
}
a[1][3]=a[1][7]=a[2][3]=a[2][7]=a[3][4]=a[3][5]=a[3][6]=a[4][2]=a[4][3]=a[4][4]=a[5][4]=0;
a[6][2]=a[6][6]=a[7][2]=a[7][3]=a[7][4]=a[7][6]=a[7][7]=a[8][1]=0;

a[1][1]=1;
do
{
if(a[i][j]!=0&&a[i][j]!=2&&a[i][j]!=3)
{
ly.push(i);
ly.push(j);
a[i][j]=3; //走過為3

if(i==8&&j==8)
{
cout<<"成功。。。"<<endl;
break;
}
else
{
i=i;
j++;
}
}
else
{
if(!ly.isEmpty()&&(a[i+1][j-1]!=0)&&(a[i+1][j-1]!=2))
{
i++;
j--;
}
else
{
i=i;
j--;
a[i][j+1]=2;
}

if(((!ly.isEmpty()&&(a[i+1][j]!=0)&&(a[i+1][j]!=2)&&(a[i+1][j]!=3))||(!ly.isEmpty()&&(a[i][j+1]!=0)&&(a[i][j+1]!=2)&&a[i][j+1]!=2)||((!ly.isEmpty()&&a[i-1][j]!=0)&&(a[i-1][j])!=2&&(a[i-1][j])!=3))||((!ly.isEmpty()&&a[i][j-1]!=0)&&(a[i][j-1]!=2)&&(a[i][j-1])!=3))
{}
//if(!ly.isEmpty()&&(((a[i+1][j]==0)||(a[i+1][j]==2)||(a[i+1][j]==3))&&((a[i][j+1]==0)||(a[i][j+1]==2)||(a[i][j+1]==3))&&((a[i-1][j]==0)||(a[i-1][j])==2)||(a[i-1][j]==3)))
else
{
ly.pop(m);
ly.pop(n);
i=m;
j=n;
a[i][j]=2; //已走不通為2

ly.Top(m);
ly.Top(n);
i=n;
j=m;
}

}

}while(1);

cout<<"輸出迷宮路線。。。:"<<endl;
do
{
ly.pop(m);
ly.pop(n);
cout<<"("<<n<<","<<m<<")"<<" ";
}while(!ly.isEmpty());
cout<<endl;

}
整不好你跟我都一個學校。。。

⑸ c語言做的迷宮問題

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>struct node
{
int sign;//標識,0什麼都不在,1在open中,2在closed中
int flag;//標志位 0/1,0可以走,1不可以走
int f,g,h;//判斷函數
int x,y;//坐標
int old;//是否old節點,0非,1是
};struct link
{
node fnode;
link *next;
link *pri;
};link *open,*closed,*bestnode,*successor,*p,*q,*r,*s;int maze_flag[7][7]={ {0,1,0,0,0,0,0},
{0,1,0,1,0,1,0},
{0,1,0,0,0,1,0},
{0,1,0,1,0,1,0},
{0,0,0,1,0,0,0},
{1,1,0,1,0,1,0},
{0,0,0,0,0,1,0}};//表示迷宮的數組,0可以走,1不可以走node maze[7][7];int judge(node n)//判斷函數,判斷n節點是否可以走
{
if(n.flag==1)
return(1);
else
return(0);
}void in_open(node n)//將n節點放入open表
{
p=open;
while(p->next!=open)
{
if(n.f>=p->fnode.f)
{
p->next->pri=(link *)malloc(sizeof(link));
p->next->pri->pri=p;
p=p->next;
p->pri->next=p;
p->pri->pri->next=p->pri;
p=p->pri;
p->fnode.flag=n.flag;
p->fnode.f=n.f;
p->fnode.g=n.g;
p->fnode.h=n.h;
p->fnode.x=n.x;
p->fnode.y=n.y;
p->fnode.old=n.old;
p->fnode.sign=n.sign=1;
}
else
p=p->next;
}
open->pri=(link *)malloc(sizeof(link));
open->pri->pri=p;
open->pri->next=open;
p->next=open->pri;
p=p->next;
p->fnode.flag=n.flag;
p->fnode.f=n.f;
p->fnode.g=n.g;
p->fnode.h=n.h;
p->fnode.x=n.x;
p->fnode.y=n.y;
p->fnode.old=n.old;
p->fnode.sign=n.sign=1;
}void out_open(node n)//將n節點從open表中移出
{
p=open;
while(p->next!=open)
{
if(n.f=p->fnode.f)
{
link *p1;
p1=p->next;
p->next=p->next->next;
p->next->pri=p;
free(p1);
n.sign=0;
}
else
p=p->next;
}
}void in_closed(node n)//將n節點放入closed表
{
while(q->next!=closed)
{
if(n.f>=q->fnode.f)
{
q->next->pri=(link *)malloc(sizeof(link));
q->next->pri->pri=q;
q=q->next;
q->pri->next=p;
q->pri->pri->next=q->pri;
q=q->pri;
q->fnode.flag=n.flag;
q->fnode.f=n.f;
q->fnode.g=n.g;
q->fnode.h=n.h;
q->fnode.x=n.x;
q->fnode.y=n.y;
q->fnode.old=n.old;
q->fnode.sign=n.sign=2;
}
else
q=q->next;
}
closed->pri=(link *)malloc(sizeof(link));
closed->pri->pri=q;
closed->pri->next=closed;
q->next=closed->pri;
q=q->next;
q->fnode.flag=n.flag;
q->fnode.f=n.f;
q->fnode.g=n.g;
q->fnode.h=n.h;
q->fnode.x=n.x;
q->fnode.y=n.y;
q->fnode.old=n.old;
q->fnode.sign=n.sign=2;
}void out_closed(node n)//將n節點從closed表中移出
{
q=closed;
while(q->next!=closed)
{
if(n.f=q->fnode.f)
{
link *q1;
q1=q->next;
q->next=q->next->next;
q->next->pri=q;
free(q1);
n.sign=0;
}
else
q=q->next;
}
}void in_bestnode(node n)//將n節點設為bestnode節點
{
while(r->next!=bestnode)
{
if(n.f>=r->fnode.f)
{
r->next->pri=(link *)malloc(sizeof(link));
r->next->pri->pri=r;
r=r->next;
r->pri->next=r;
r->pri->pri->next=r->pri;
r=r->pri;
r->fnode.flag=n.flag;
r->fnode.f=n.f;
r->fnode.g=n.g;
r->fnode.h=n.h;
r->fnode.x=n.x;
r->fnode.y=n.y;
r->fnode.old=n.old;
}
else
r=r->next;
}
bestnode->pri=(link *)malloc(sizeof(link));
bestnode->pri->pri=r;
bestnode->pri->next=bestnode;
r->next=bestnode->pri;
r=r->next;
r->fnode.flag=n.flag;
r->fnode.f=n.f;
r->fnode.g=n.g;
r->fnode.h=n.h;
r->fnode.x=n.x;
r->fnode.y=n.y;
r->fnode.old=n.old;
}void out_bestnode(node n)//將n節點的bestnode去掉
{
r=bestnode;
while(r->next!=bestnode)
{
if(n.f=p->fnode.f)
{
link *r1;
r1=r->next;
r->next=r->next->next;
r->next->pri=r;
free(r1);
}
else
r=r->next;
}
}void in_successor(node n)//將n節點設置為successor節點
{
s=successor;
while(s->next!=successor)
{
if(n.f>=s->fnode.f)
{
s->next->pri=(link *)malloc(sizeof(link));
s->next->pri->pri=s;
s=p->next;
s->pri->next=s;
s->pri->pri->next=s->pri;
s=s->pri;
s->fnode.flag=n.flag;
s->fnode.f=n.f;
s->fnode.g=n.g;
s->fnode.h=n.h;
s->fnode.x=n.x;
s->fnode.y=n.y;
s->fnode.old=n.old;
}
else
s=s->next;
}
successor->pri=(link *)malloc(sizeof(link));
successor->pri->pri=s;
successor->pri->next=successor;
s->next=successor->pri;
s=s->next;
s->fnode.flag=n.flag;
s->fnode.f=n.f;
s->fnode.g=n.g;
s->fnode.h=n.h;
s->fnode.x=n.x;
s->fnode.y=n.y;
s->fnode.old=n.old;
}void out_successor(node n)//將n節點的successor去掉
{
s=successor;
while(s->next!=successor)
{
if(n.f=p->fnode.f)
{
link *s1;
s1=s->next;
s->next=s->next->next;
s->next->pri=s;
free(s1);
}
else
s=s->next;
}
}void print(link *n)//輸出link類型的表n
{
link *forprint;
forprint=n;
printf("the key is ");
while(forprint->next!=n)
printf("(%d,%d)\n",forprint->fnode.x,forprint->fnode.y);
}int main()
{
//初始化部分
//這部分的功能是將二維的整形數組賦值給node型的二維數組
int i=0,j=0;
for(i=0;i<7;i++)
for(j=0;j<7;j++)
{
maze[i][j].x=i;
maze[i][j].y=j;
maze[i][j].flag=maze_flag[i][j];
if(maze[i][j].flag==0)
{
maze[i][j].h=6-i+6-j;
maze[i][j].sign=maze[i][j].f=maze[i][j].g=maze[i][j].old=0;
}
else
maze[i][j].h=-1;
}
for(i=0;i<7;i++)//輸出迷宮示意圖
{
for(j=0;j<7;j++)
{
printf("%2d",maze_flag[i][j]);
}
printf("\n");
}
//這部分的功能是將open,closed,bestnode表初始化,都置為空表
p=open=(link *)malloc(sizeof(link));
open->next=open;
open->pri=open;
q=closed=(link *)malloc(sizeof(link));
closed->next=closed;
closed->pri=closed;
r=bestnode=(link *)malloc(sizeof(link));
bestnode->next=bestnode;
bestnode->pri=bestnode;
//將第一個元素即(0,0)節點放入open表,開始演算法
in_open(maze[0][0]);
maze[0][0].f=maze[0][0].h;
link *s2;
s2=successor;
if(open->next!=open)//open表為空時則失敗退出
{
while(1)
{
in_bestnode(open->fnode);//將open表的第一個元素放入bestnode中
in_closed(maze[open->fnode.x][open->fnode.y]);//將open表的第一個元素放入closed中
maze[open->fnode.x][open->fnode.y].g++;//將open表的第一個元素的g值加一,表示已經走了一步
out_open(maze[open->fnode.x][open->fnode.y]);//將open表的第一個元素刪除 if(bestnode->fnode.x==6&&bestnode->fnode.y==6)//若bestnode是目標節點,則成功退出
{
printf("succes!!\nthen print the key:\n");
print(closed);
break;
}
else//若bestnode不是目標節點,則擴展其臨近可以走的節點為successor
{
if(i==0||j==0||i==6||j==6)
{
if(i==0&&j==0)//若為(0,0),則判斷右邊和下邊的元素
{
if(judge(maze[i][j+1])==0)
in_successor(maze[i][j+1]);
if(judge(maze[i+1][j])==0)
in_successor(maze[i+1][j]);
}
else if(i==0&&j==6)//若為(0,6),則判斷左邊和下邊的元素
{
if(judge(maze[i-1][j])==0)
in_successor(maze[i-1][j]);
if(judge(maze[i+1][j])==0)
in_successor(maze[i+1][j]);
}
else if(i==6&&j==0)//若為(6,0),則判斷左邊和上邊的元素
{
if(judge(maze[i-1][j])==0)
in_successor(maze[i-1][j]);
if(judge(maze[i][j-1])==0)
in_successor(maze[i][j-1]);
}
else if(i==6&&j==6)//若為(6,6),則判斷左邊和上邊的元素
{
if(judge(maze[i-1][j])==0)
in_successor(maze[i-1][j]);
if(judge(maze[i][j-1])==0)
in_successor(maze[i][j-1]);
}
else if(i==0)//若為第一行的元素(不在角上),則判斷左邊,下邊和右邊
{
if(judge(maze[i][j+1])==0)
in_successor(maze[i][j+1]);
if(judge(maze[i][j-1])==0)
in_successor(maze[i][j-1]);
if(judge(maze[i+1][j])==0)
in_successor(maze[i+1][j]);
}
else if(i==6)//若為第七行的元素(不在角上),則判斷左邊,上邊和右邊
{
if(judge(maze[i][j+1])==0)
in_successor(maze[i][j+1]);
if(judge(maze[i][j-1])==0)
in_successor(maze[i][j-1]);
if(judge(maze[i-1][j])==0)
in_successor(maze[i-1][j]);
}
else if(j==0)//若為第一列的元素(不在角上),則判斷右邊,下邊和上邊
{
if(judge(maze[i+1][j])==0)
in_successor(maze[i+1][j]);
if(judge(maze[i-1][j])==0)
in_successor(maze[i-1][j]);
if(judge(maze[i][j+1])==0)
in_successor(maze[i][j+1]);
}
else if(j==6)//若為第七列的元素(不在角上),則判斷左邊,上邊和上邊
{
if(judge(maze[i+1][j])==0)
in_successor(maze[i+1][j]);
if(judge(maze[i-1][j])==0)
in_successor(maze[i-1][j]);
if(judge(maze[i][j-1])==0)
in_successor(maze[i][j-1]);
}
}
else//若為中將的元素,則判斷四個方向的節點
{
if(judge(maze[i][j-1])==0)
in_successor(maze[i][j-1]);
if(judge(maze[i][j+1])==0)
in_successor(maze[i][j+1]);
if(judge(maze[i-1][j])==0)
in_successor(maze[i-1][j]);
if(judge(maze[i+1][j])==0)
in_successor(maze[i+1][j]);
}
}
while(s2->next!=successor)//對所有的successor節點進行下列操作
{
maze[s2->fnode.x][s2->fnode.y].g=bestnode->fnode.g+bestnode->fnode.h;//計算g(suc)=g(bes)+h(bes,suc)
if(s2->fnode.sign==1)//若在open表中,則置為old,記下較小的g,並從open表中移出,放入closed表中
{
s2->fnode.old=1;
if(s2->fnode.g<maze[s2->fnode.x][s2->fnode.y].g)
{
maze[s2->fnode.x][s2->fnode.y].g=s2->fnode.g;
maze[s2->fnode.x][s2->fnode.y].f=maze[s2->fnode.x][s2->fnode.y].g+maze[s2->fnode.x][s2->fnode.y].h;
out_open(maze[s2->fnode.x][s2->fnode.y]);
in_closed(maze[s2->fnode.x][s2->fnode.y]);
maze[s2->fnode.x][s2->fnode.y].old=0;
}
else
continue;
}
else if(s2->fnode.sign==2)//若在closed表中,則置為old,記下較小的g,並將old從closed表中移出,將較小的g的節點放入closed表中
{
s2->fnode.old=1;
if(s2->fnode.g<maze[s2->fnode.x][s2->fnode.y].g)
{
maze[s2->fnode.x][s2->fnode.y].g=s2->fnode.g;
maze[s2->fnode.x][s2->fnode.y].f=maze[s2->fnode.x][s2->fnode.y].g+maze[s2->fnode.x][s2->fnode.y].h;
out_closed(maze[s2->fnode.x][s2->fnode.y]);
in_closed(maze[s2->fnode.x][s2->fnode.y]);
maze[s2->fnode.x][s2->fnode.y].old=0;
}
else
continue;
}
else//若即不再open表中也不在closed表中,則將此節點放入open表中,並計算此節點的f值
{
in_open(maze[s2->fnode.x][s2->fnode.y]);
maze[s2->fnode.x][s2->fnode.y].f=maze[s2->fnode.x][s2->fnode.y].g+maze[s2->fnode.x][s2->fnode.y].h;
}
s2=s2->next;
}
s2=successor;
}
}
else
printf("error!!This maze does not have the answer!");
return(0);
}

⑹ c語言迷宮問題的詳細解法,最好有說明。

//老老實實地算:
int Sum1(int n)
{
int nSum = 0;

for(int i = 1; i <= n; i++)
for(int j = 1; j <= i; j++)
nSum += j;

return nSum;
}

//高度技巧地算(遞歸):
int Sum2(int n)
{
if(n == 1)return 1;
else return n * (n + 1) / 2 + Sum2(n - 1);
}

//投機取巧地算:
int Sum3(int n)
{
int nSum = 0;

//1+1+2+1+2+3+1+2+3+4+1+2+3+4......+N 可以化簡為:
//1 * N + 2 * (N - 1) + 3 * (N - 3) + ... + N * 1

for(int i = 1; i <= n; i++)
nSum += i * (n - i + 1);

return nSum;
}

//絕對偷懶地算:
int Sum4(int n)
{
//根據求和公式可以計算得到:
// 1+1+2+1+2+3+1+2+3+4+1+2+3+4......+N
// = N * (N + 1) * (N + 2) / 6
//(這里就不詳細介紹計算過程啦,中學課本里就有)
//所以簡單起見,直接返回計算值就可以啦

return n * (n + 1) * (n + 2) / 6;
}

至於哪個更精簡,自己看著辦吧:-)

⑺ c語言迷宮問題

問題出在MazePath內部的e是一個局部變數,並且隨著while循環其內容不斷變化。保存一個局部變數的地址是沒有意義的,函數返回後就被清除。解決的辦法是動態分配QElemType類型的對象,還有要注意一下,這個程序中分配的內存最後都沒有被釋放,這可是個不好的編程習慣。

改好了,你自己看看有沒有錯誤。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct QElemType
{
int x,y;
struct QElemType *parent;//用於存儲節點的前一個節點
} QElemType;

typedef struct QNode//隊列節點
{
QElemType *data;
struct QNode *next;
} QNode, *QueuePtr;

typedef struct
{
QueuePtr front;
QueuePtr rear;
} LinkQueue;

void InitQueue(LinkQueue *Q)//創建隊列
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
Q->rear->next = NULL;
//Q->front=Q->rear=NULL;
}

void EnQueue(LinkQueue *Q, QElemType *e)//將元素入隊
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}

QElemType *DeQueue(LinkQueue *Q)//將元素出對
{
QElemType *e;
QueuePtr p;
p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
free(p);
return (e);

}
int QueueEmpty(LinkQueue *Q)//判斷隊列是否為空
{
if(Q->front==Q->rear )
return 1;
else
return 0;
}

QElemType *NextPos(QElemType *e,int i)//節點的下一個位置
{
QElemType *t = (QElemType *)malloc(sizeof(QElemType));
*t = *e;

switch(i)
{
case 1:t->y=t->y+1;break;
case 2:t->x=t->x+1;break;
case 3:t->y=t->y-1;break;
case 4:t->x=t->x-1;break;
}
return (t);
}
QElemType *MazePath(int maze[][10],LinkQueue *Q)//迷宮函數
{
int i;
QElemType *e, *p;
e = (QElemType *)malloc(sizeof(QElemType));
// InitQueue(&Q);
e->x=1;//入口位置,即為第一個節點
e->y=1;
e->parent=NULL; //第一個節點的前一個節點賦值為空
EnQueue(Q, e);//將第一個節點入隊
while(!QueueEmpty(Q))
{
e=DeQueue(Q); //把元素出對,並賦值給e
if(e->x==8&&e->y==8)//出口位置,直接返回最後一個節點
return e;
for(i=1;i<=4;i++)
{//將四個方向能走通的位置的節點入隊,並將其的parent指向上一個節點
p=NextPos(e,i);
p->parent=e;
if(maze[p->x][p->y]==1)
{
maze[p->x][p->y]=2;
EnQueue(Q,p);
}
else
{
free(p);
p = NULL;
}
}

}
printf("zhao bu ");//找不到路徑
return NULL;
}
void main()//主函數
{
LinkQueue Q;
QElemType *p, *t;
int maze[10][10]=//其中1為能走通
{{0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,1,1,1,0,1,0},
{0,1,1,0,1,1,1,0,1,0},
{0,1,1,1,1,0,0,1,1,0},
{0,1,0,0,0,1,1,1,1,0},
{0,1,1,1,0,1,1,1,1,0},
{0,1,0,1,1,1,0,1,1,0},
{0,1,0,0,0,1,0,0,1,0},
{0,0,1,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0}
};
InitQueue(&Q);
p=MazePath(maze,&Q);//e即為最後一個節點
while(p)//回溯尋找路徑
{
printf("(%d,%d),",p->x,p->y);

t = p->parent;
free(p);
p = t;
}

getchar();
}

⑻ C語言迷宮問題求救!

可電腦自動創建迷宮的迷宮

#include<stdio.h>
#include<stdlib.h>
#define STACK_INI_SIZE 100
#define STACKINCREMENT 50
#define NULL 0
typedef struct
{
int *top;
int *base;
int length;
int stacksize;
}sqstack;
int mg[25][25];
int m=1,n=1,x,y;
/*********************************************/
main()
{
void initstack(sqstack *s);/*初始化棧*/
void stackpush(sqstack *s,int);/*增加棧頂*/
void stackpop(sqstack *s);/*撤銷棧頂*/
void stackinput(sqstack *s);/*輸出棧*/
int mgway(sqstack *s);/*迷宮路徑*/
void destorystack(sqstack *s);/*撤銷棧S*/
void makemg(sqstack *s);/*製造迷宮*/
sqstack s;
int i,flag1=1,flag2=1,flag3=1;
char ch;
srand((unsigned)time(NULL));
while(flag1)
{
initstack(&s);
flag2=1;
makemg(&s);
i=mgway(&s);
if(i==0)
printf("此迷宮沒有通路\n");
else
stackinput(&s);
destorystack(&s);
printf("還繼續么?");
fflush(stdin);
scanf("%c",&ch);
while(flag2)
{
if(ch=='n'||ch=='N')
{
flag1=0;
flag2=0;
}
else if(ch=='y'||ch=='Y')
{
flag1=1;
flag2=0;
}
else
{
printf("輸入錯誤請重新輸入");
fflush(stdin);
scanf("%c",&ch);
}
}

}
}
/*********************************************/
void initstack(sqstack *s)/*初始化棧*/
{
s->top=s->base=(int *)malloc(STACK_INI_SIZE*sizeof(int));
if(!s->base)
exit(1);
s->stacksize=STACK_INI_SIZE;
*(s->base)=0;
s->top++;
*(s->top)=101;
s->top++;
s->length=2;
}
/*********************************************/
void stackpush(sqstack *s,int i)/*增加棧頂*/
{
if(s->length>=s->stacksize)
{
printf("路過");
s->base=(int *)realloc(s->base,(STACK_INI_SIZE+STACKINCREMENT)*sizeof(int));
if(!s->base)
exit(1);
s->top=s->base+s->length;
s->stacksize+=STACKINCREMENT;
stackinput(s);
}
if(s->length==0)
{
*(s->base)=i;
s->top++;
s->length++;
}
else
{
*(s->top)=i;
s->top++;
s->length++;
}
}
/*********************************************/
void stackpop(sqstack *s)/*刪除棧頂*/
{
if(s->length==0)
printf("棧空 無法刪除");
if(s->length==1)
{
s->top--;
*(s->top)=*(s->base)=NULL;
s->length=0;
}
else
{
s->top--;
*(s->top)=NULL;
s->length--;
}
}
/*********************************************/
void stackinput(sqstack *s)/*迷宮棧的輸出*/
{
int w,x,y,z,i=0,*p;
p=s->base;
p++;
printf("迷宮正確路徑\n");
while(p!=s->top)
{
printf("(%d%d,%d%d)",x=*p/1000,y=*p/100%10,z=*p%100/10,w=*p%10);
p++;
i++;
if(i==7)
{
printf("\n");
i=0;
}
}
}
/*********************************************/
int mgway(sqstack *s)/*迷宮路徑*/
{
int gudge(sqstack *s,int);/*判斷是否能通行*/
int homing(sqstack *s);/*退棧後I所對應的方向*/
int i=1,j,k;
while(s->top!=s->base)
{
if(i<5)
j=gudge(s,i);
if(j==1&&i<5)
{
k=m*100+n;
stackpush(s,k);
if(m==y-2&&n==x-2)
{
return(1);
}
else
i=1;
}
else
{

if(m==0&&n==0)
return(0);
else if(i==4||i==5)
{
i=homing(s);
stackpop(s);
i++;
}
else
i++;
}
}
return(0);
}
/*********************************************/
int gudge(sqstack *s,int i)/*退棧後i所對應的方向*/
{
int echo(sqstack *s);
if(i==1)
n++;
if(i==2)
m++;
if(i==3)
n--;
if(i==4)
m--;
if((mg[m][n]==0||mg[m][n]==2)&&echo(s))
return(1);
else
{
if(i==1)
n--;
if(i==2)
m--;
if(i==3)
n++;
if(i==4)
m++;
return(0);
}
}
/*********************************************/
int echo(sqstack *s)
{
int i,*p,*q;
i=m*100+n;
p=s->top;
q=s->base;
q++;
p--;
while(p!=q&&*p!=i)
p--;
if(*p==i)
return(0);
else
return(1);
}
/*********************************************/
int homing(sqstack *s)/*i退位後所對應的方向*/
{
int a,b,c,d,*q;
q=s->top;
q--;
a=(*q)/100;
b=(*q)%100;
q--;
c=(*q)/100;
d=(*q)%100;
m=(*q)/100;
n=(*q)%100;
if(a==c)
{
if(d-b==1)
return(3);
else if(d-b==-1)
return(1);
}
else if(b==d)
{
if(c-a==1)
return(4);
else if(c-a==-1)
return(2);
}
return(0);
}
void destorystack(sqstack *s)
{
if(*(s->base)!=NULL)
free(s->base);
s->length=0;
}
/*********************************************/
void makemg(sqstack *s)/*創建迷宮及輸出迷宮圖的函數*/
{
int mgway(sqstack *s);
void clearstack(sqstack *s);
int flag=1,flag2=1,i,j,k;
char ch;
while(flag)
{
printf("請輸入迷宮的長寬(長度范圍2-15,寬范圍2-15)\n");
printf("輸入長");
fflush(stdin);
scanf("%d",&y);
printf("輸入寬");
fflush(stdin);
scanf("%d",&x);
if(x<16&&x>3&&y>3&&y<16)
flag=0;
if(flag==0)
printf("自動篩選能通過的迷宮需要一段時間,請耐心等待,如20秒後無法顯示出迷宮樣本請重試... ...\n");
}
flag=1;
while(flag2)
{
m=1;
n=1;
for(i=0;i<x;i++)
for(j=0;j<y;j++)
mg[i][j]=rand()%3;
i=0;
for(j=0;j<y;j++)
{
mg[i][j]=1;
mg[j][i]=1;
}
i=y-1;
for(j=0;j<x;j++)
mg[j][i]=1;
i=x-1;
for(j=0;j<y;j++)
mg[i][j]=1;
mg[1][1]=0;
mg[x-2][y-2]=0;
k=mgway(s);
if(k==1)
flag2=0;
else
clearstack(s);
}
printf(" ");
for(i=0;i<y;i++)
printf("%2d",i);
printf("\n ");
for(i=0;i<y;i++)
printf("↓");
printf("\n");
for(i=0;i<x;i++)
{
printf("%2d→",i);
for(j=0;j<y;j++)
{
if(mg[i][j]==2)
printf("0 ");
else
printf("%d ",mg[i][j]);
}
printf("\n");
}
}
/*********************************************/
void clearstack(sqstack *s)/*清空棧對於此程序而言*/
{
s->top=s->base;
*(s->base)=0;
s->top++;
*(s->top)=101;
s->top++;
s->length=2;
}

⑼ c語言程序設計 迷宮問題

海龜作圖行不。這是我大一時的C語言課程設計,我自已做的。
高級級語言課程設計實驗報告

實驗課程:課程設計 年級:2004級 實驗成績:
課程設計名稱 海龜作圖 姓名:
任課教師: 學號:2004810025 實驗日期:
一、目的
通過編一些小程序,鞏固和利用所學的知識,加強變成能力。
本課題涉及的知識內容:for循環嵌套,if語句,二維數組,文件創建與保存,自定義函數等高級語言內容。
二、內容與設計思想
1. 設計內容
海龜爬行過程中,筆朝下紀錄海龜爬行蹤跡,筆朝上則不紀錄並保存蹤跡,
1表示筆朝上,2表示朝下,3右轉彎,4左轉彎,5,x向前走x格,6列印
9結束
2. 主要代碼結構
main()函數調用了兩個函數
3. 主要代碼段分析。
譬如print函數,列印海龜蹤跡並保存。Step函數當筆朝上時海龜走過的數組值加一
三、使用環境
本次上機實踐所使用的平台和相關軟體
平台:Windows 2000
相關軟體:VC++

四、調試過程
1. 測試結果分析
經檢驗,運行結果正確
五、總結
1. 設計中遇到的問題及解決過程
調試過程中出現一些邏輯和語法錯誤,但是語法錯誤容易糾正,而
邏輯錯誤則比較難糾正。有時會漏掉「,」,「;」,「}」等符號
2. 設計體會和收獲。
發現自己也能解決有點復雜的問題
六、附錄
1. 源代碼
/*海龜作圖,活動區域50*50,超出區域,海龜死亡游戲完*/
#include<stdio.h>
void print(int [][49]);
void move(int [][49],int,int,int);
main()
{
int step[49][49];
int a,gostep,direct=1,record=1,i,j;
for(i=0;i<=49;i++)
for(j=0;j<=49;j++)
step[i][j]=0;
while(1)
{
scanf("%d,%d",&a,&gostep);
if(a==2) record=1;
if(a==1) record=0;
if(a==4)
{
direct++;
if(direct==5) direct=1;
continue;
}
if(a==3)
{
direct--;
if(direct==0) direct=4;
continue;
}
if(a==5)
{
move(step,gostep,direct,record);
continue;
}
if(a==6)
print(step);
if(a==9)
return 0;
}
}
/*列印海龜蹤跡並保存*/
void print(int s[][49])
{
int i,j;
FILE *fp;
fp=fopen("D:\\step.txt","w");
for(i=0;i<=49;i++)
{
for(j=0;j<=49;j++)
{
printf(s[i][j]==0? " ":"*");
fprintf(fp,s[i][j]==0? " ":"*");
}
printf("\n");
}
fclose(fp);
}
void move(int t[][49],int i,int j,int k)
{
static int x=0,y=0;
int xmove,ymove,num;
if(j==1)
{
xmove=1;ymove=0;}
if(j==2)
{
xmove=0;ymove=-1;
}
if(j==3)
{
xmove=-1;ymove=0;
}
if(j==4)
{
xmove=0;ymove=1;
}
for(num=0;num<i;num++)
{
t[0][0]=1;
x+=xmove;
y+=ymove;
if(x<0||x>49||y<0||y>49)
{
printf("the place is danger ,you are died");
exit();
}
t[y][x]+=k;
}
}

⑽ C語言迷宮問題

#include<stdio.h>
#include<conio.h>
int migong[10][10]= //設置迷宮,最外圍1為牆 里邊0為可走路徑 1為障礙
{
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,1,1,1},
{1,0,1,1,1,1,1,0,0,1},
{1,0,1,0,0,0,0,0,0,1},
{1,0,0,0,1,0,1,1,1,1},
{1,1,1,1,0,0,1,1,1,1},
{1,0,0,0,0,1,1,1,1,1},
{1,0,1,1,0,0,1,1,1,1},
{1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
int num;
struct
{
int x,y,d;
}lj[100];//x,y分別為垂直和水平方向

void start()
{
int top=0,x,y,d,find;//d為設置方向,上下左右。find為設置找不找得到路
lj[top].x=1;
lj[top].y=1;
migong[1][1]=-1;
find=0;d=-1;

while(top>-1){
if(lj[top].x==8&&lj[top].y==8)
{
printf("迷宮路徑如下:\n");
printf("start->");
for(x=0;x<=top;x++)
{
printf("(%d,%d)-> ",lj[x].x,lj[x].y);//把找到的路徑輸出
num++;
if(num%8==0)
printf("\n");
}
printf("->end!\n");
}

while(d<4&&find==0){
d++;
switch(d){
case 0:x=lj[top].x-1; y=lj[top].y; break;//方向為上
case 1:x=lj[top].x; y=lj[top].y+1;break;//方向為右
case 2:x=lj[top].x+1; y=lj[top].y; break;//方向為下
case 3:x=lj[top].x; y=lj[top].y-1;}//方向為左
if(migong[x][y]==0)
find=1;
}

if(find==1){ //判斷是否找得到
lj[top].d=d;
top++;
lj[top].x=x;
lj[top].y=y;
d=-1;find=0; //重新調整方向
migong[x][y]=-1;}
else{
migong[lj[top].x][lj[top].y]=0;
top--;d=lj[top].d; //找不到的話退棧
}
}
}

void main()
{
start();
getch();
}