php回溯法写迷宫,算法————回溯法--迷宫问题(残缺)

#include

using namespace std;

int** path;

int** result;

int** square;

int dirx[8] = { 0,0,1,1,1,-1,-1,-1 };//8个方向变量

int diry[8] = { 1,-1,-1,0,1,-1,0,1 };

int turn(999);

int level(0);

int finalLevel(0);

int* dir;//步向

int m, n;//迷宫大小

int p, q, r, s;//罗密哦朱丽叶坐标

bool trackback(int p, int q);

bool IsFull();

void main() {

cout << "输入迷宫大小:" << endl;

cin >> m >> n;

cout << "输入罗密欧与朱丽叶坐标:" << endl;

cin >> p >> q >> r >> s;

//记录

result = new int* [2];

result[0]=new int[n * m];

result[1] = new int[n * m];

path = new int* [2];

path[0] = new int[n * m];

path[1] = new int[n * m];

//记录每一步的方向

dir = new int[m * n];

//储存迷宫

square = new int* [m + 2];

for (int i = 0;i < m + 2;i++) {

square[i] = new int[n + 2];

}

for (int i = 0;i < m + 2;i++) {

for (int j = 0;j < n + 2;j++)

square[i][j] = 0;

}

int k,x,y;

cout << "输入封闭房间个数:" << endl;

cin >> k;

cout << "输入封闭房间的坐标;" << endl;

for (int i = 0;i < k;i++) {

cin >> x >> y;

square[x][y] = -1;

}

for (int i = 0, j = 0;i < m + 2;i++) {

square[i][j] = 1;

}

for (int i = 0, j = 0;j < n + 2;j++) {

square[i][j] = 1;

}

for (int i = 0, j = n + 1;i

square[i][j] = 1;

}

for (int i = m + 1, j = 0;j < n + 2;j++) {

square[i][j] = 1;

}

dir[0] = -1;

trackback(p, q);

cout << turn - 1 << endl;

int i;

for (i = 0;i < finalLevel;i++) {

square[result[0][i]][result[1][i]] = i + 1;

}

for (i = 1;i < m + 1;i++) {

for (int j = 1; j < n + 1;j++) {

cout << square[i][j] << " ";

}

cout << endl;

}

}

bool trackback(int p, int q) {

path[0][level]=p;

path[1][level] = q;

level++;

square[p][q] = 1;

if (p==r&&q==s){

if (IsFull()) {

int count(0);

for (int i = 1;i < level;i++) {

if (dir[i] != dir[i - 1]) {

count++;

}

if (count < turn) {

finalLevel = level;

turn = count;

for (int i = 0;i < level;i++) {

result[0][i] = path[0][i];

result[1][i] = path[1][i];

}

}

}

}

square[p][q] = 0;

level--;

return false;

}

for (int i = 0;i < 8;i++) {

int x, y;

x = p + dirx[i];

y = q + diry[i];

if (square[x][y]==0) {

dir[level] = i;

trackback(x, y);

}

}

square[p][q] = 0;

level--;

return true;

}

bool IsFull() {

for (int i = 1;i <= m;i++) {

for (int j = 1;j <= n;j++) {

if (square[i][j] == 0) {

return false;

}

else {

return true;

}

}

}

}

trackback:

不完善,会出现无法便利的状况,我明明设计了isfull函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值