迷宫问题
C代码
#include<stdio.h>
typedef struct node{
int x;
int y;
int f; /*如果需要输出路径,则需要f */
int s; /* 步数 */
}node;
int main()
{
node que[2501];
int a[51][51] = {0}, book[51][51] = {0};
/* 右 下 左 上 */
int next[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int head, tail;
int i, j, k, n, m, startx, starty, p, q, tx, ty, flag;
scanf("%d %d", &n, &m);
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
scanf("%d", &a[i][j]);
}
}
scanf("%d %d %d %d", &startx, &starty, &p, &q);
head = 1;
tail = 1;
que[tail].x = startx;
que[tail].y = starty;
que[tail].f = 0;
que[tail].s = 0;
tail++;
book[startx][starty] = 1;
/*
0表示暂时未到达,1表示已到达
*/
flag = 0;
while(head < tail)
{
for(k = 0; k <= 3; k++)
{
/*
tx的变化为纵向的
ty的变化为横向的
*/
tx = que[head].x + next[k][0];
ty = que[head].y + next[k][1];
if(tx < 1 || tx > n || ty < 1 || ty > m)
{
continue;
}
if(a[tx][ty] == 0 && book[tx][ty] == 0)
{
book[tx][ty] = 1;
que[tail].x = tx;
que[tail].y = ty;
que[tail].f = head;
que[tail].s = que[head].s + 1;
tail++;
}
if(tx == p && ty == q)
{
flag = 1;
break;
}
}
if(flag == 1)
{
break;
}
head++;
}
printf("%d", que[tail - 1].s);
getchar();
return 0;
}
样例运行结果:
利用C++的queue
#include<bits/stdc++.h>
using namespace std;
int a[100][100], book[100][100];
struct point{
int x;
int y;
int step;
};
queue<point> que;
// 方向依次为: 右 下 左 上
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int main()
{
int n, m, startx, starty, p, q;
cout << "请输入迷宫的行数和列数:" << endl;
cin >> n >> m;
cout << "请输入迷宫的内容:" << endl;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
cin >> a[i][j];
}
}
cout << "请输入起点坐标位置以及终点坐标位置:" << endl;
cin >> startx >> starty >> p >> q;
//BFS
point start;
start.x = startx;
start.y = starty;
start.step = 0;
que.push(start);
book[startx][starty] = 1;
int flag = 0;
while(!que.empty())
{
int x = que.front().x;
int y = que.front().y;
if(x == p && y == q)
{
flag = 1;
cout << que.front().step << endl;
break;
}
for(int k = 0; k <= 3; k++)
{
int tx, ty;
tx = x + dx[k];
ty = y + dy[k];
//判断是否出界
if(tx < 1 || tx > n || ty < 1 || ty > m)
{
continue;
}
if(a[tx][ty] == 0 && book[tx][ty] == 0)
{
point tmp;
tmp.x = tx;
tmp.y = ty;
tmp.step = que.front().step + 1;
que.push(tmp);
book[tx][ty] = 1;
}
}
que.pop();
}
if(flag == 0)
{
cout << "no answer!" << endl;
}
return 0;
}
样例运行结果: