题目介绍(找出一条路径)
使用二维数组mz[][]记录迷宫
使用ma[][]=dep(变量) 标记路径,从起点dep=1 到终点,dep依次 +1。
方便介绍使用方行迷宫默认起点为左上角,终点为右下角(可自行拓展)
迷宫介绍
-1
墙(不可通行)0
没有走过的路-2
死胡同
算法介绍
- 当走到终点退出,即mz[i][j]值大于0
- 对于迷宫采用(x,y)坐标轴(如下图) 所以对(x,y)点 对应mz[y][x]
- ps.上一条我也不知道为什么搞反了坐标轴 还得拧着想一下💥
#include <iostream>
#include <windows.h>
#include <iomanip>
#define N 10
//可以调整N测试一下较小型的迷宫
//int mz[5][5]={
// { 0,-1,-1,-1,-1},
// { 0,-1,-1,-1,-1},
// { 0,-1,-1,-1,-1},
// { 0, 0, 0, 0, 0},
// { 0,-1,-1,-1, 0}
//};
int mz[10][10]={
{ 0, 0,-1,-1,-1,-1,-1,-1,-1,-1}, // 0
{-1, 0, 0,-1,-1, 0, 0,-1, 0,-1}, //-1
{-1, 0, 0,-1, 0, 0, 0,-1, 0,-1}, //2
{-1, 0, 0, 0, 0,-1,-1, 0, 0,-1}, //3
{-1, 0,-1,-1,-1, 0, 0, 0, 0,-1}, //4
{-1, 0, 0, 0,-1, 0, 0, 0, 0,-1}, //5
{-1, 0,-1, 0, 0, 0,-1, 0, 0,-1}, //6
{-1, 0,-1,-1,-1, 0,-1,-1, 0,-1}, //7
{-1,-1, 0, 0, 0, 0, 0, 0, 0, 0}, //8
{-1,-1,-1,-1,-1,-1,-1,-1,-1, 0} //9
// 0 -1 2 3 4 5 6 7 8 9
};
int dep = 1;
bool walkDown(int x,int y);//从 (x,y) 向下走
bool walkRight(int x,int y);
bool walkUp(int x,int y);
bool walkLeft(int x,int y);
bool doWalk(int x,int y);//从 (x,y)试着走
void showMaze();
using namespace std;
int main(){
doWalk(0,0);
showMaze();
system("pause");
return 0;
}
void showMaze(){
for(int i = 0;i<N;i++){
for(int j = 0;j<N;j++){
cout.width(3);
cout.setf(ios::right);
switch (mz[i][j]){
case 0:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);//设置红色和绿色相加
cout<<" ?";
break;
case -1:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);//设置颜色,没有添加颜色,故为原色
cout<<" @";
break;
case -2:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);//设置红色
cout<<" X";
break;
default:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);//设置绿色
cout<<mz[i][j];
}
}
cout <<endl;
}
}
bool doWalk(int x,int y){//试着走 (x,y)
if(mz[N-1][N-1]> 0){//走到终点了
return true;
}else if(mz[y][x]== 0){//之前没走过
mz[y][x] = dep++;
if(walkDown(x,y)||walkRight(x,y)||walkUp(x,y)||walkLeft(x,y)){
return true;
}else{
mz[y][x] = -2;//若 这个点的上下左右都不可以走了 就是死胡同
dep--;
return false;
}
}else {
return false;
}
}
bool walkDown(int x,int y){
if(y==N-1){
return false;
}else
{
return doWalk(x,y+1);
}
}
bool walkRight(int x,int y){
if(x==N-1){
return false;
}else
{
return doWalk(x+1,y);
}
}
bool walkUp(int x,int y){
if(y==0){
return false;
}else
{
return doWalk(x,y-1);
}
}
bool walkLeft(int x,int y){
if(x==0){
return false;
}else
{
return doWalk(x-1,y);
}
}
参考
颜色调整 c++怎么设置颜色
原理参照 java版