今天给各位分享c语言迷宫问题的知识,其中也会对C语言迷宫问题回溯进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、C语言编程 迷宫问题(队列)2、c语言的迷宫问题3、C语言迷宫问题,求该算法的时间和空间的复杂度。写出求解的过程,比如如下的求解格式4、求解c语言一递归迷宫问题5、迷宫问题,C语言6、C语言迷宫问题,求该算法的时间和空间的复杂度。迷宫的路径已经定义好,求出路的算法。
C语言编程 迷宫问题(队列)
c#界面绘制的时候,底层重绘每次会清除画布背景,然后再全部重新绘制,这才是导致闪烁最主要的原因。于是重载消息发送函数操作,禁掉这条消息。代码如下:
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0014) // 禁掉清除背景消息
return;
base.WndProc(ref m);
}
c语言的迷宫问题
//寻路_带权重_带障碍_最短_文件地图_不闪——wlfryq——//
#include stdio.h
#include stdlib.h
#include string.h
#include windows.h
typedef struct
{
int x;
int y;
} _PT;
_PT pt;
int row=0,col=0;
//设置CMD窗口光标位置
void setxy(int x, int y)
{
COORD coord = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
//获取当前CMD当前光标所在位置
void getxy()
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coordScreen = {0, 0}; //光标位置
CONSOLE_SCREEN_BUFFER_INFO csbi;
if (GetConsoleScreenBufferInfo(hConsole, csbi))
{
pt.x=csbi.dwCursorPosition.X;
pt.y=csbi.dwCursorPosition.Y;
}
}
typedef struct
{
int x;
int y;
int type;
int v;
}PT;
PT **s=NULL,stack[50],start,end,c;
int pos=0;
void prt()
{
int i,j;
system(“cls”);
for(i=0;irow;i++)
{
for(j=0;jcol;j++)
{
if(s[i][j].type==1)
{
printf(“■”);
}
else if(i==end.x j==end.y)
{
printf(“★”);
}
else if(i==c.x j==c.y)
{
printf(“◎”);
}
else
{
printf(” “);
}
}
printf(“\n”);
}
Sleep(500);
}
void stack_in(PT a)
{
stack[pos++]=a;
}
PT stack_out()
{
int i;
PT t;
t=stack[0];
for(i=0;ipos-1;i++)
{
stack[i]=stack[i+1];
}
pos–;
return t;
}
void fun()
{
PT a;
int x,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].vv+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].vv+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].vv+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].vv+1))
{
s[x][y+1].v=v+1;
stack_in(s[x][y+1]);
}
}
}
void go(int x, int y)
{
printf(“\n按任意键开始\n”);
getchar();
int v;
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;
}
else if(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;
}
else if(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;
}
else if(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(“\nreturn go\n”);
system(“pause”);
}
void GetMapFromFile()
{
int i,j,x,y,len;
char ch[50]={‘\0’};
FILE* fp=fopen(“e:\\map1.txt”,”r”);
if(fp==NULL)
{
printf(“open file failed.\n”);
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;i0;i–)
{
if(ch[i]!=’0′ ch[i]!=’1′)
{
ch[i]=’\0′;
}
else
{
break;
}
}
len=strlen(ch);
s=(PT**)malloc(sizeof(PT*)*row);
for(j=0;jlen;j++)
{
*(s+j)=(PT*)malloc(sizeof(PT)*len);
}
}
y=0;
for(i=0;ilen;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);
}
int main()
{
GetMapFromFile();
int i,j;
int x,y;
x=end.x;
y=end.y;
s[x][y].v=0;
stack_in(end);
fun();
c=start;
prt();
go(start.x,start.y);
return 0;
}
C语言迷宫问题,求该算法的时间和空间的复杂度。写出求解的过程,比如如下的求解格式
时间复杂度应该是O(n)吧,因为每个迷宫上的位置最多入栈一次。空间复杂度应该也一样吧。
求解c语言一递归迷宫问题
给你给伪算法:(设坐标为x,y,坐标向右和下延生。)
函数:
{
判断当前是不是(7,7),如果是,表示走出迷宫。打印轨迹
1 尝试往左先走一步(x-1,如果x小于0,或者对应位置标识为阻塞)
2 1如果成功,用本函数递归调用左走一步的坐标,并记下当前位置到轨迹列表。
3 尝试往前先走一步(y+1,如果y小于0,或者对应位置标识为阻塞)
4 3如果成功,用本函数递归调用前走一步的坐标,并记下当前位置到轨迹列表。
5 尝试往右先走一步(x+1,如果x小于0,或者对应位置标识为阻塞)
6 5如果成功,用本函数递归调用前走一步的坐标,并记下当前位置到轨迹列表。
如果是(0,0),表示没有合适的路径可走出迷宫。
如果不是(0,0),将轨迹列表最后一位弹出。
}
迷宫问题,C语言
#includestdio.h
int main(void)
{
int maze[100][100];
int MAZE[100][100];
int m,n;
int p,q;
printf(“输入迷宫的行数m,列数n:\n”);
scanf(“%d%d”,m,n);
for(p=0;p=n+1;p++){
maze[0][p]=1;
maze[m+1][p]=1;
}
for(p=1;p=m;p++){
maze[p][0]=1;
maze[p][n+1]=1;
printf(“输入第%d行迷宫:\n”,p);
for(q=1;q=n;q++){
scanf(“%d”,maze[p][q]);
MAZE[p][q]=maze[p][q];
}
}
struct location{
int row;
int col;
}way[100];
int movehoriz[8]={-1,0,1,1,1,0,-1,-1};
int movevert[8]={1,1,1,0,-1,-1,-1,0};
int endrow=m;
int endcol=n;
way[0].row=1;
way[0].col=1;
int start=3;
int i=0;
int k;
int j;
int found=0;
while(!found){
for(k=start;kstart+8;k++){
if((maze[way[i].row+movevert[k%8]][way[i].col+movehoriz[k%8]]==0)((i==0)||((way[i].row!=way[i-1].row)||(way[i].col!=way[i-1].col)))){
way[i+1].row=way[i].row+movevert[k%8];
way[i+1].col=way[i].col+movehoriz[k%8];
i++;
start=(k+5)%8;
break;
}
if((way[i].row==endrow)(way[i].col==endcol)){
break;
}
if((maze[way[i].row+movevert[k]][way[i].col+movehoriz[k]]==0)(way[i].row==way[i-1].row)(way[i].col==way[i-1].col)){
way[i].row=0;
way[i].col=0;
maze[way[i].row][way[i].col]=1;
i–;
start=(start+4)%8;
}
}
if(k=start+8){
break;
}
if((way[i].row==endrow)||(way[i].col==endcol)){
found=1;
break;
}
}
if(found){
for(j=0;j=i;j++){
printf(“maze[%d][%d]\n”,way[j].row,way[j].col);
}
}
else{
printf(“The maze does not have a path\n”);
}
}
QQ:366597114 不一定完全对。也许有小错误。有问题可以来问我哈
C语言迷宫问题,求该算法的时间和空间的复杂度。迷宫的路径已经定义好,求出路的算法。
时间复杂度:o(nm) (这是时间的上界,最多把所有点都遍历一遍,且边与点的访问是同阶的)
空间复杂度:o(nm) (把这个图存下来就要nm的空间)
关于c语言迷宫问题和C语言迷宫问题回溯的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。