• 算法————回溯法--迷宫问题(残缺)


    #include<iostream>
    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<m+2;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函数

  • 相关阅读:
    idea 使用
    scala
    Java开发工具
    ActiveMQ基础
    Java 多线程实战
    Java 内部类和Lambda
    Spring 学习
    平滑重启php
    opcache
    redis的hscan命令
  • 原文地址:https://www.cnblogs.com/zlshy/p/11934488.html
Copyright © 2020-2023  润新知