c++ 链栈求解迷宫
2015-07-22 11:13
323 查看
迷宫求解:
给定一个M X N 的迷宫图, 求一条从指定的入口到出口的路径。
只能上下左右行走,求得的路径没有重复的方块
给定一个M X N 的迷宫图, 求一条从指定的入口到出口的路径。
只能上下左右行走,求得的路径没有重复的方块
#pragma once #include <iostream> using namespace std; #define M 10 #define N 10 struct road { int x; int y; struct road *next; }; const int map[M] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; class maze { public: maze(); bool check_up(int x, int y); bool check_down(int x, int y); bool check_right(int x, int y); bool check_left(int x, int y); void move_up(int x, int y); void move_down(int x, int y); void move_right(int x, int y); void move_left(int x, int y); void result(int x_s, int y_s, int x_r, int y_r); void push(); void print(); void show(); ~maze(); private: char box[M] ; struct road *head; };
#include "Stack.h" maze::maze() { for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { box[i][j] = map[i][j]; } } head = new road; head->next = NULL; } maze::~maze() { struct road *p = head; while (head->next != NULL) { p = head; head = head->next; cout << "( " << p->x << ", " << p->y << ")" << endl; delete p; } } bool maze::check_up(int x, int y) { if (box[x - 1][y] == 0) return true; else return false; } bool maze::check_down(int x, int y) { if (box[x + 1][y] == 0) return true; else return false; } bool maze::check_right(int x, int y) { if (box[x][y+1] == 0) return true; else return false; } bool maze::check_left(int x, int y) { if (box[x][y - 1] == 0) return true; else return false; } void maze::move_up(int x, int y) { struct road *p; p = new road; p->x = x - 1; p->y = y; box[p->x][p->y] = 2; p->next = head->next; head->next = p; } void maze::move_down(int x, int y) { struct road *p; p = new road; p->x = x + 1; p->y = y; box[p->x][p->y] = 2; p->next = head->next; head->next = p; } void maze::move_right(int x, int y) { struct road *p; p = new road; p->x = x; p->y = y + 1; box[p->x][p->y] = 2; p->next = head->next; head->next = p; } void maze::move_left(int x, int y) { struct road *p; p = new road; p->x = x; p->y = y - 1; box[p->x][p->y] = 2; p->next = head->next; head->next = p; } void maze::push() { struct road *p = head->next; head->next = p->next; delete p; } void maze::result(int x_s, int y_s, int x_r, int y_r) { struct road *p; p = new road; p->x = x_s; p->y = y_s; box[p->x][p->y] = 2; p->next = head->next; head->next = p; p = head->next; while (p->x != x_r || p->y != y_r) { if (check_up(p->x, p->y)) move_up(p->x, p->y); else if (check_down(p->x, p->y)) move_down(p->x, p->y); else if (check_right(p->x, p->y)) move_right(p->x, p->y); else if (check_left(p->x, p->y)) move_left(p->x, p->y); else push(); p = head->next; } } void maze::show() { struct road *p = head->next; while (head->next != NULL) { head->next = p->next; cout << "( " << p->x << ", " << p->y << ")" << endl; box[p->x][p->y] = 3; delete p; p = head->next; } } void maze::print() { for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { if (box[i][j] == 1) cout << " * "; if (box[i][j] == 2) cout << " . "; if (box[i][j] == 0) cout << " "; if (box[i][j] == 3) cout << " 。"; } cout << endl; } }
#include "Stack.h" int main() { maze R; R.result(1,1,M-2,N-2); R.show(); R.print(); system("pause"); return 0; }
相关文章推荐
- xml的创建 c++哦
- C++去掉字符串中首尾空格和所有空格
- C语言实现 输入数字按从小到大排序
- C++ 模版类的单向链式线性表
- [C++设计模式] proxy 代理模式
- C/C++通过MySQL的API连接数据库并对数据库中内容RSA解密
- 新标准c++程序设计教程chapter2_2015.7.21
- POJ 2253
- C++ string 详解
- 【LeetCode】20 Valid Parentheses (c++实现)
- 【LeetCode】205 Isomorphic Strings (c++实现)
- C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】
- C++定义隐式转换函数,将类转换为内部的一个成员变量
- Python读取Postgresql后将数据传递给C++共享库
- C语言之单链表的插入、删除与查找
- C++继承与多态问题
- 黑马程序员_C语言基础_数组之冒泡排序、快速选择排序、折半查找
- sublime text3 C语言环境配置
- [c语言]宏中##的用法(续)
- C++常用字符串函数