//寻路_带权重_带障碍_最短_文件地图_不闪------wlfryq------//
#include <stdioh>
#include <stdlibh>
#include <stringh>
#include <windowsh>
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))
{
ptx=csbidwCursorPositionX;
pty=csbidwCursorPositionY;
}
}
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;i<row;i++)
{
for(j=0;j<col;j++)
{
if(s[i][j]type==1)
{
printf("■");
}
else if(i==endx && j==endy)
{
printf("★");
}
else if(i==cx && j==cy)
{
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;i<pos-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=ax;
y=ay;
if(x==startx && y==starty)
{
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]);
}
}
}
void go(int x, int y)
{
printf("\n按任意键开始\n");
getchar();
int v;
while(1)
{
if(x==endx && y==endy)
{
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(y2,x);
x=x-1;
printf(" ");
setxy(y2,x);
printf("◎");
Sleep(500);
continue;
}
else if(x+1<=row-1 && s[x+1][y]v==v-1)
{
c=s[x+1][y];
setxy(y2,x);
x++;
printf(" ");
setxy(y2,x);
printf("◎");
Sleep(500);
continue;
}
else if(y-1>=0 && s[x][y-1]v==v-1)
{
c=s[x][y-1];
setxy(y2,x);
y--;
printf(" ");
setxy(y2,x);
printf("◎");
Sleep(500);
continue;
}
else if(y+1<=col-1 && s[x][y+1]v==v-1)
{
c=s[x][y+1];
setxy(y2,x);
y++;
printf(" ");
setxy(y2,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:\\map1txt","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;i>0;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;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);
}
int main()
{
GetMapFromFile();
int i,j;
int x,y;
x=endx;
y=endy;
s[x][y]v=0;
stack_in(end);
fun();
c=start;
prt();
go(startx,starty);
return 0;
}
ret_val=fgets(st,n,stdin); 从标准输入设备读入一行字符,含换行符。若拍入字符个数多于需要,则 st[] 最后一个字符 为 '\0'
---
若拍入字符个数多于需要,才会 进入
while(getchar()!='\n') continue;
这句中的 continue 有或没有是 一样 的, 也就是说用:
while(getchar()!='\n') ; 是一样的。
这句的作用 相当于 清掉 拍入的多余的字符,直到遇到 换行符。
例如: n=5;
拍入 12345678换行。
fgets 读入 1234 到st[], st[4]='\0'
getchar() 依次读去 5 6 7 8 换行 -- 循环了5次。
你的问题 大概 指 这件事。 continue 从st[] 尾开始。
以上就是关于c语言的迷宫问题全部的内容,包括:c语言的迷宫问题、请帮忙解读下C语言下面代码中continue 的光标在哪儿 是在输入的第一个字符 还是st[i]、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)