二维迷宫+动画版(C语言)
二维迷宫(dfs)动画版
#include<stdio.h>
#include<Windows.h>
#include"graphics.h"
#define N 20
int n,m;//n行 m列
int sx,sy,fx,fy;//start:sx,sy;end:fx,fy;
int MAP[N][N]={0};//map
int visit[N][N]={0};//visit
int solution=0;
char s[5];
int pp;
int curr;
void dfs(int x,int y);
void creatMAP();
void print();
void z0();//pp=0动态演示
void z1();//pp=1展示结果
int main()
{
creatMAP();
printf("请输入0\n");
scanf("%d",&pp);
MessageBox(NULL,TEXT("开始二维迷宫了哦!"),TEXT("提示"),MB_OK);
initgraph(360,500); // 初始化,显示一个窗口,窗口宽为390像素,长为550像素
initgraph(m*100+200,n*100);//定义画布如果迷宫宽高为3 3,则创建500长,300高
IMAGE img1; // 定义 IMAGE1 对象
loadimage(&img1, "D:\\WSX.jpg",400,250); // 读取图片到 img1 对象中
putimage(801, 0, &img1); // 在左上角的坐标 (801, 0) 位置显示 IMAGE1 对象
IMAGE img2;
loadimage(&img2, "D:\\WSX2.jpg", 400, 250);
putimage(801, 250, &img2);
IMAGE img3;
loadimage(&img3, "D:\\WSX3.jpg", 400, 250);
putimage(801, 500, &img3);
int i,j;
for (i=0; i < n*100; i = i + 100) //创建8*8的白色边框网格棋盘
{
for (j = 0; j < m*100; j = j + 100)
{
setfillcolor(WHITE);
rectangle(j, i, j + 100, i + 100);
}
}
for (i = 1; i <= n; i=i+1) //画出障碍物的位置
{
for (j = 1; j<=m; j = j + 1)
{
if(visit[i][j]==1)
{
setfillcolor(RED);
solidcircle((i-1)* 100 + 50, (j-1)* 100 + 50, 40);
}
}
}
dfs(sx,sy);
Sleep(2000);
closegraph();
printf("共 %d 个结果",solution);
return 0;
}
void creatMAP()
{
int OBN;//障碍物个数
printf("请输入行、列、障碍物个数:\n");
scanf("%d%d%d",&n,&m,&OBN);
printf("请输入开始位置和结束位置:\n");
scanf("%d%d%d%d",&sx,&sy,&fx,&fy);//strat and end
int temp1,temp2;//暂时变量
int i;//遍历
printf("请输入障碍物位置:\n");
for(i=0;i<OBN;i++)
{
scanf("%d%d",&temp1,&temp2);
MAP[temp1][temp2]=1;
visit[temp1][temp2]=1;
}
for(i=0;i<=m;i++)
{
visit[0][i]=1;
visit[n+1][i]=1;
}
for(i=1;i<=n;i++)
{
visit[i][0]=1;
visit[i][m+1]=1;
}
}
void dfs(int x,int y)
{
setfillcolor(BLUE);
z0();
if(x==fx&&y==fy)
{
solution+=1;
print();
solidcircle((x-1) * 100 + 50, (y-1) * 100 + 50, 40);
z0();//延时判断
clearcircle((x-1) * 100 + 50, (y-1) * 100 + 50, 40);
return;
}
solidcircle((x-1) * 100 + 50, (y-1) * 100 + 50, 40);//并且将此时位置画上蓝色圆
visit[x][y]=1;
if(visit[x][y+1]==0)//(人眼看的下面一个位置)
dfs(x,y+1);
if(visit[x+1][y]==0)//右
dfs(x+1,y);
if(visit[x][y-1]==0)//上
dfs(x,y-1);
if(visit[x-1][y]==0)//左
dfs(x-1,y);
visit[x][y]=0;//归位
z0();
clearcircle((x-1) * 100 + 50, (y-1) * 100 + 50, 40);
return;
}
void z0()
{
if(pp==0) Sleep(0.2*1000);//延时函数;0.2秒
}
void z1()
{
if(pp==1) Sleep(0.2*1000);//延时函数;0.2秒
}
void print()
{
sprintf(s,"%d",solution);
outtextxy(n*100+100,m*100/2,s);
}
二维迷宫原始代码
#include<stdio.h>
#define N 20
int n,m;//n行 m列
int sx,sy,fx,fy;//start:sx,sy;end:fx,fy;
int MAP[N][N]={0};//map
int visit[N][N]={0};//visit
int solution=0;
void dfs(int x,int y);
void creatMAP();
int main()
{
creatMAP();
dfs(sx,sy);
return 0;
}
void creatMAP()
{
int OBN;//障碍物个数
printf("请输入行、列、障碍物个数:\n");
scanf("%d%d%d",&n,&m,&OBN);
printf("请输入开始位置和结束位置:\n");
scanf("%d%d%d%d",&sx,&sy,&fx,&fy);//strat and end
int temp1,temp2;//暂时变量
int i;//遍历
printf("请输入障碍物位置:\n");
for(i=0;i<OBN;i++)
{
scanf("%d%d",&temp1,&temp2);
MAP[temp1][temp2]=1;
visit[temp1][temp2]=1;
}
for(i=0;i<=m;i++)
{
visit[0][i]=1;
visit[n+1][i]=1;
}
for(i=1;i<=n;i++)
{
visit[i][0]=1;
visit[i][m+1]=1;
}
}
void dfs(int x,int y)
{
if(x==fx&&y==fy)
{
solution+=1;
return;
}
visit[x][y]=1;
if(visit[x][y+1]==0)//(人眼看的下面一个位置)
dfs(x,y+1);
if(visit[x+1][y]==0)//右
dfs(x+1,y);
if(visit[x][y-1]==0)//上
dfs(x,y-1);
if(visit[x-1][y]==0)//左
dfs(x-1,y);
visit[x][y]=0;//归位
return;
}
graphics.h头文件下载
1.下载链接
2.下载最新版
3.
4.用vc++ 6.0打开上面代码即可。//我的电脑只有这个路径TT^TT