“test.cpp”
<strong><span style="font-size:18px;">#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; #include <stack> #define ROW 12 #define COL 10 struct Pos { int _row; int _col; }; void PrintMaze(int* maze,int row,int col) { for (int i = 0;i < row;++i) { for (int j = 0;j < col;j++) { cout<<maze[i*col+j]<<" "; } cout<<endl; } cout<<endl; } void InitMaze(int* maze,int row,int col) { FILE* fout = fopen("Maze2.txt","r"); for (int i = 0;i < row;++i) { for (int j = 0;j < col;) { char c = fgetc(fout); if (c == '0' || c == '1') { maze[i*col+j] = c - '0'; j++; } } } fclose(fout); } void InitMinMaze(int* minmaze,int row,int col) { for (int i = 0;i < row;++i) { for (int j = 0;j < col;j++) { minmaze[i*col+j] = 1; } } } bool CheckAccess(int* maze,int row,int col,Pos pos) { if(pos._row >= 0 && pos._row < row && pos._col >= 0 && pos._col < col && maze[pos._row*col+pos._col] == 0) { return true; } else { return false; } } void GetPath(int* maze,int* minmaze,int row,int col,stack<Pos>& s,Pos pos,int& min) { s.push(pos); maze[pos._row*col+pos._col] = 2; while (!s.empty()) { Pos cur = s.top(); if (cur._row == row - 1 || cur._col == col - 1 || cur._row == 0) { if (min > s.size()) { min = s.size(); stack<Pos> tmp; InitMinMaze(minmaze,row,col); while (!s.empty()) { tmp.push(s.top()); minmaze[s.top()._row*col+s.top()._col] = 2; s.pop(); } while (!tmp.empty()) { s.push(tmp.top()); tmp.pop(); } maze[cur._row*col+cur._col] = 2; s.pop(); } else { maze[cur._row*col+cur._col] = 2; s.pop(); } } //上 Pos next = cur; next._row--; if (CheckAccess(maze,row,col,next)) { maze[next._row*col+next._col] = 2; s.push(next); continue; } //右 next = cur; next._col++; if (CheckAccess(maze,row,col,next)) { maze[next._row*col+next._col] = 2; s.push(next); continue; } //下 next = cur; next._row++; if (CheckAccess(maze,row,col,next)) { maze[next._row*col+next._col] = 2; s.push(next); continue; } //左 next = cur; next._col--; if (CheckAccess(maze,row,col,next)) { maze[next._row*col+next._col] = 2; s.push(next); continue; } s.pop(); } } void test() { int maze[ROW][COL] = {0}; int minmaze[ROW][COL] = {0}; InitMaze((int*)maze,ROW,COL); PrintMaze((int*)maze,ROW,COL); InitMinMaze((int*)minmaze,ROW,COL); //PrintMaze((int*)minmaze,ROW,COL); stack<Pos> s; Pos pos = {1,0}; int min = 10000000; GetPath((int*)maze,(int*)minmaze,ROW,COL,s,pos,min); PrintMaze((int*)minmaze,ROW,COL); cout<<"路径长度 = "<<min<<endl; } int main() { test(); system("pause"); return 0; } </span></strong>