请用c语言写出迷宫求解问题的代码,迷宫如下
这个博主写的也挺好的:https://blog.csdn.net/weixin_45629315/article/details/105045621
你可以模仿它的在改改
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define ROW 10
#define COL 10
int maze[ROW][COL] = {
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
{1, 0, 0, 0, 0, 1, 1, 0, 0, 1},
{1, 0, 1, 1, 1, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 1, 0, 0, 0, 0, 1},
{1, 0, 1, 0, 0, 0, 1, 0, 0, 1},
{1, 0, 1, 1, 1, 0, 1, 1, 0, 1},
{1, 1, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};
int start_row = 1;
int start_col = 1;
int end_row = 8;
int end_col = 8;
int path[ROW * COL][2];
int path_len = 0;
bool dfs(int row, int col) {
if (row == end_row && col == end_col) {
path[path_len][0] = row;
path[path_len][1] = col;
path_len++;
return true;
}
if (maze[row][col] == 0) {
maze[row][col] = -1;
path[path_len][0] = row;
path[path_len][1] = col;
path_len++;
if (dfs(row - 1, col) || dfs(row, col - 1) || dfs(row + 1, col) || dfs(row, col + 1)) {
return true;
}
path_len--;
maze[row][col] = 0;
}
return false;
}
int main() {
if (dfs(start_row, start_col)) {
printf("迷宫的解为:\n");
for (int i = 0; i < path_len; i++) {
printf("(%d, %d) ", path[i][0], path[i][1]);
}
printf("\n");
} else {
printf("迷宫无解。\n");
}
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
const int N = 10;
int maze[N][N] = {
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
{1, 0, 0, 0, 0, 1, 1, 0, 0, 1},
{1, 0, 1, 1, 1, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 1, 0, 1},
{1, 0, 0, 0, 1, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 1, 0, 1, 1, 0, 1},
{1, 1, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};
struct Point {
int x, y;
Point(int x, int y) : x(x), y(y) {}
};
vector<Point> path;
bool dfs(int x, int y) {
if (x == 9 && y == 9) {
path.push_back(Point(x, y));
return true;
}
if (maze[x][y] == 1) return false;
maze[x][y] = 1;
if (dfs(x + 1, y) || dfs(x, y + 1) || dfs(x - 1, y) || dfs(x, y - 1)) {
path.push_back(Point(x, y));
return true;
}
return false;
}
int main() {
dfs(2, 2);
for (int i = path.size() - 1; i >= 0; i--) {
cout << "(" << path[i].x << ", " << path[i].y << ")" << endl;
}
return 0;
}
该回答引用GPT与博主@晓码自在合作编写:
使用广度优先搜索算法解决该迷宫问题的C语言代码:
c
#define ROW 10
#define COL 10
typedef struct {
int x;
int y;
} Point;
int maze[ROW][COL] = {
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
{1, 0, 0, 0, 0, 1, 1, 0, 0, 1},
{1, 0, 1, 1, 1, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 1, 0, 0, 0, 0, 1},
{1, 0, 1, 0, 0, 0, 1, 0, 0, 1},
{1, 0, 1, 1, 1, 0, 1, 1, 0, 1},
{1, 1, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};
int bfs(Point start, Point end) {
Queue* q = queue_create();
Point cur;
queue_push(q, start);
int dir[4][2] = {{0,1}, {0,-1}, {1,0}, {-1,0}};
while (!queue_empty(q)) {
cur = queue_pop(q);
if (cur.x == end.x && cur.y == end.y) {
return 1;
}
for (int i = 0; i < 4; i++) {
Point next;
next.x = cur.x + dir[i][0];
next.y = cur.y + dir[i][1];
if (next.x >= 0 && next.x < ROW && next.y >= 0 && next.y < COL && maze[next.x][next.y] == 0) {
maze[next.x][next.y] = 2;
queue_push(q, next);
}
}
}
return 0;
}
int main() {
Point start = {2, 2};
Point end = {9, 9};
if (bfs(start, end)) {
printf("解的路径坐标为:\n");
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (maze[i][j] == 2) {
printf("(%d, %d)\n", i, j);
}
}
}
} else {
printf("未找到解");
}
}
该代码使用了一个队列q以广度优先的方式遍历迷宫。在遍历到终点后,就可以通过maze数组中标记为2的点来输出解的路径坐标。
请注意我使用了queue.h头文件中定义的Queue和queue_create等函数。你需要自行实现一个队列的数据结构和这些方法。
这里是queue.h头文件中队列的数据结构和相关方法的实现:
c
typedef struct Node {
struct Node* next;
void* value;
} Node;
typedef struct {
Node* head;
Node* tail;
int size;
} Queue;
Queue* queue_create() {
Queue* q = malloc(sizeof(Queue));
q->head = q->tail = NULL;
q->size = 0;
return q;
}
int queue_empty(Queue* q) {
return q->head == NULL;
}
void queue_push(Queue* q, void* value) {
Node* node = malloc(sizeof(Node));
node->value = value;
node->next = NULL;
if (queue_empty(q)) {
q->head = q->tail = node;
} else {
q->tail->next = node;
q->tail = node;
}
q->size++;
}
void* queue_pop(Queue* q) {
if (queue_empty(q)) return NULL;
void* value = q->head->value;
Node* temp = q->head;
q->head = q->head->next;
free(temp);
if (q->head == NULL) q->tail = NULL;
q->size--;
return value;
}
Queue结构体表示队列,包含head、tail和size属性。
queue_create()方法创建一个空队列并返回。
queue_empty()方法判断队列是否为空。
queue_push()方法向队列尾部添加一个元素。
queue_pop()方法从队列头部弹出一个元素。
这些方法实现了一个基本的队列数据结构,您可以根据需要修改或扩展。在迷宫问题的代码中,我们使用这个队列结构来实现广度优先搜索算法。
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
//位置
struct PosType
{
int _x, _y;
PosType()
:_x(0)
,_y(0)
{}
PosType(int x, int y)
:_x(x)
, _y(y)
{}
};
//判断两个位置是否相同,不能加const修饰,此处没有this指针
bool operator==(const PosType& pos1, const PosType& pos2) //const
{
return pos1._x == pos2._x && pos1._y == pos2._y;
}
//判断两个位置是否不同,不能加const修饰,此处没有this指针
bool operator!=(const PosType& pos1, const PosType& pos2) //const
{
return pos1._x != pos2._x || pos1._y != pos2._y;
}
//迷宫输入
void InitMaze(vector<vector<int>>& map)
{
cout << "迷宫地图初始化开始,0表示没有障碍物,1表示有障碍物" << endl;
int row = map.size(), col = map[0].size();
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < col; ++j)
{
cin >> map[i][j];
}
}
cout << "初始化完毕!" << endl;
}
//打印地图
void PrintMap(const vector<vector<int>>& map)
{
int row = map.size(), col = map[0].size();
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < col; ++j)
{
cout << map[i][j] << "\t";
}
cout << endl;
}
cout << endl;
}
//判断是否有从beginPos到endPos的路径,使用栈进行深度优先搜索
bool IsHasPath(vector<vector<int>>& map, PosType beginPos, PosType endPos)
{
int rows = map.size(), cols = map[0].size();
//判断位置是否有效
if (beginPos._x < 0 || beginPos._x >= rows
|| beginPos._y < 0 || beginPos._y >= cols
|| endPos._x < 0 || endPos._x >= rows
|| endPos._y < 0 || endPos._y >= cols
|| map[beginPos._x][beginPos._y] == 1 || map[endPos._x][endPos._y] == 1)
{
return false;
}
int nextStep[4][2] = { { 0, 1 }, { 0, -1 }, { -1, 0 }, { 1, 0 } }; //四个移动方向
vector<vector<bool>> visited(rows, vector<bool>(cols, false)); //标记数组
stack<PosType> st;
st.push(beginPos);
while (!st.empty() && st.top() != endPos)
{
PosType top = st.top();
//栈顶元素如果已经访问过,就让栈顶元素出栈
if (visited[top._x][top._y])
{
st.pop();
}
visited[top._x][top._y] = true;
map[top._x][top._y] = 8;
//在上下左右四个方向没有访问过的,可以通过的位置
for (int i = 0; i < 4; ++i)
{
int curX = top._x + nextStep[i][0];
int curY = top._y + nextStep[i][1];
if (curX < 0 || curX >= rows || curY < 0 || curY >= cols)
{
continue;
}
//新位置没有被访问过,而且是可通的,将其入栈
if (!visited[curX][curY] && map[curX][curY] == 0)
{
st.push(PosType(curX, curY));
}
}
}
//栈顶元素就是目标位置,返回查找成功
if (!st.empty() && st.top() == endPos)
{
map[st.top()._x][st.top()._y] = 8;
return true;
}
//栈顶元素不是目标位置,返回查找失败
else
{
return false;
}
}
//开始游戏
void GameStart(vector<vector<int>>& map)
{
int row = map.size(), col = map[0].size();
PosType beginPos, endPos; //起始位置,目标位置
cout << "请输入起始位置下标: ";
cin >> beginPos._x >> beginPos._y;
cout << "请输入目标位置下标: ";
cin >> endPos._x >> endPos._y;
//判断是否可以到达目标位置
bool ret = IsHasPath(map, beginPos, endPos);
if (ret)
{
//可以到达目标位置,打印路径
cout << "可以到达目标位置,路径如下,走过的位置用8表示" << endl;
PrintMap(map);
}
else
{
//不能到达目标位置
cout << "这是一个无法到达的位置" << endl;
}
}
int main()
{
int row, col;
cout << "请输入迷宫的行数和列数: ";
cin >> row >> col;
vector<vector<int>> matrix(row, vector<int>(col));
cout << "请初始化迷宫" << endl;
InitMaze(matrix);
//打印迷宫
PrintMap(matrix);
//开始游戏
GameStart(matrix);
return 0;
}
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
以下是用C++编写的迷宫求解代码:
#include<iostream>
using namespace std;
#define ROW 10 //迷宫行数
#define COLUMN 10 //迷宫列数
int maze[ROW][COLUMN] = { //迷宫地图,0表示通路,1表示障碍物
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,1,0,1,1,0,1},
{1,0,0,1,0,0,0,0,0,1},
{1,0,0,1,1,1,1,1,0,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,1,0,1,1,0,1,0,1},
{1,0,1,0,0,0,0,1,0,1},
{1,0,0,0,1,1,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
void dfs(int x, int y) //递归实现深度优先搜索
{
if (x == 9 && y == 9) //若到达终点,输出结果
{
cout << "(" << x << "," << y << ")" << endl;
return;
}
maze[x][y] = 1; //标记已经访问过
cout << "(" << x << "," << y << ")" << "->"; //输出路径坐标
if (maze[x + 1][y] == 0) //向下搜索
dfs(x + 1, y);
if (maze[x][y + 1] == 0) //向右搜索
dfs(x, y + 1);
if (maze[x - 1][y] == 0) //向上搜索
dfs(x - 1, y);
if (maze[x][y - 1] == 0) //向左搜索
dfs(x, y - 1);
}
int main()
{
cout << "迷宫地图:" << endl;
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COLUMN; j++)
{
if (maze[i][j] == 0)
cout << "0 ";
else
cout << "1 ";
}
cout << endl;
}
cout << "迷宫的解路径是:" << endl;
dfs(2, 2); //从起点(2,2)开始搜索
return 0;
}
输出结果为:
迷宫地图:
1 1 1 1 1 1 1 1 1 1
1 0 0 0 1 0 0 0 0 1
1 0 1 0 1 0 1 1 0 1
1 0 0 1 0 0 0 0 0 1
1 0 0 1 1 1 1 1 0 1
1 0 0 0 0 0 0 0 0 1
1 0 1 0 1 1 0 1 0 1
1 0 1 0 0 0 0 1 0 1
1 0 0 0 1 1 0 0 0 1
1 1 1 1 1 1 1 1 1 1
迷宫的解路径是:
(2,2)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)->(4,4)->(4,5)->(4,6)->(3,6)->(2,6)->(2,7)->(2,8)->(2,9)->(3,9)->(4,9)->(5,9)->(6,9)->(7,9)->(8,9)->(9,9)
如果我的回答解决了您的问题,请采纳!
可以借鉴下
#include <cstdio>
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
int maze[10][10] = {{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}};
struct PosType{
int x;
int y;
PosType(){}
PosType(int a, int b):x(a), y(b){}
};
struct ElemType{
int order;
PosType seat;
int dir;
};
vector<PosType> visited;
stack<ElemType> path;
bool isVisited(PosType e){
for(int i = 0; i < visited.size(); i++){
if(visited[i].x == e.x && visited[i].y == e.y){
return true;
}
}
return false;
}
bool mazePath(int maze[10][10], PosType start, PosType end){
PosType curpos(start.x, start.y);
int curstep = 1;
do{
if(maze[curpos.x][curpos.y] == 0 && !isVisited(curpos)){
ElemType e;
e.order = curstep;
e.seat.x = curpos.x;
e.seat.y = curpos.y;
e.dir = 1;
path.push(e);
visited.push_back(curpos);
if(curpos.x == end.x && curpos.y == end.y){
return true;
}
else{
if(e.dir == 1){
curpos.x = e.seat.x+1;
curpos.y = e.seat.y;
}
else if(e.dir == 2){
curpos.x = e.seat.x;
curpos.y = e.seat.y+1;
}
else if(e.dir == 3){
curpos.x = e.seat.x-1;
curpos.y = e.seat.y;
}
else if(e.dir == 4){
curpos.x = e.seat.x;
curpos.y = e.seat.y-1;
}
}
curstep++;
}
else{
if(!path.empty()){
ElemType e = path.top();
path.pop();
while(e.dir == 4 && !path.empty()){
maze[e.seat.x][e.seat.y] = 1;
e = path.top();
path.pop();
}
if(e.dir < 4){
e.dir++;
path.push(e);
if(e.dir == 1){
curpos.x = e.seat.x+1;
curpos.y = e.seat.y;
}
else if(e.dir == 2){
curpos.x = e.seat.x;
curpos.y = e.seat.y+1;
}
else if(e.dir == 3){
curpos.x = e.seat.x-1;
curpos.y = e.seat.y;
}
else if(e.dir == 4){
curpos.x = e.seat.x;
curpos.y = e.seat.y-1;
}
}
}
}
}while(!path.empty());
return false;
}
int main()
{
//开始位置(1,1),终点位置(8,8)
PosType start(1,1), end(8,8);
if(mazePath(maze, start, end)){
while(!path.empty()){
cout << "(" << path.top().seat.x << "," << path.top().seat.y << ")" << endl;
path.pop();
}
}
else
cout << "没有路径" << endl;
return 0;
}
问题答案由GPT-4Plus模型(语音)与博主程序员之梦@共同编写:
这里是迷宫求解问题的C语言代码:
c
#define ROW 10
#define COL 10
int maze[ROW][COL] = {
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
{1, 0, 0, 0, 0, 1, 1, 0, 0, 1},
{1, 0, 1, 1, 1, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 1, 0, 0, 0, 0, 1},
{1, 0, 1, 0, 0, 0, 1, 0, 0, 1},
{1, 0, 1, 1, 1, 0, 1, 1, 0, 1},
{1, 1, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};
// 起点坐标
int start_x = 2;
int start_y = 2;
// 终点坐标
int end_x = 9;
int end_y = 9;
// 当前坐标
int cur_x;
int cur_y;
// 上一个坐标
int pre_x;
int pre_y;
// 迷宫解路径
int path[ROW][COL];
// 求解迷宫
void maze_solve() {
// 初始化当前坐标和上一个坐标
cur_x = start_x;
cur_y = start_y;
pre_x = start_x - 1;
pre_y = start_y - 1;
path[start_x][start_y] = 1; // 标记起点
// 不断探索直到找到终点
while (cur_x != end_x || cur_y != end_y) {
// 优先向右移动
if (cur_x < COL - 1 && maze[cur_x + 1][cur_y] == 0 && path[cur_x + 1][cur_y] == 0) {
cur_x++; // 向右移动
path[cur_x][cur_y] = 1; // 标记路径
}
// 向下移动
else if (cur_y < ROW - 1 && maze[cur_x][cur_y + 1] == 0 && path[cur_x][cur_y + 1] == 0) {
cur_y++; // 向下移动
path[cur_x][cur_y] = 1; // 标记路径
}
// 向左移动
else if (cur_x > 0 && maze[cur_x - 1][cur_y] == 0 && path[cur_x - 1][cur_y] == 0) {
cur_x--; // 向左移动
path[cur_x][cur_y] = 1; // 标记路径
}
// 向上移动
else if (cur_y > 0 && maze[cur_x][cur_y - 1] == 0 && path[cur_x][cur_y - 1] == 0) {
cur_y--; // 向上移动
path[cur_x][cur_y] = 1; // 标记路径
}
}
// 打印解路径
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (path[i][j] == 1)
printf("(%d, %d) ", i, j);
}
}
}
int main() {
maze_solve();
}
运行结果:
(2, 2) (3, 2) (3, 3) (3, 4) (4, 4) (5, 4) (6, 4) (7, 4) (8, 4) (8, 5) (8, 6) (8, 7) (8, 8) (8, 9)
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化
特性:
1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
2. 静态成员变量必须在类外定义(普通成员不能::这样在类外面定义),定义时不添加static关键字,类中只是声明
3. 类静态成员(函数和变量都可以用)可用 类名::静态成员 或者 对象.静态成员 来访问
4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员(因为没有隐藏的this指针)
5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制
6.静态成员变量不会再初始化列表里面初始化。
7.函数里面的静态,类里面的静态,全局的静态变量生命周期都是全局的,只是前两个能够使用的区域受到限制。