zoukankan      html  css  js  c++  java
  • 算法————回溯法--迷宫问题(残缺)

    #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函数

  • 相关阅读:
    Tire树的理解和应用
    C语言:socket简单模拟http请求
    C语言:关于socket的基础知识点
    php中的ip2long和long2ip的理解
    理解php中的pack/unpack/ord/chr
    zlog学习笔记(mdc)
    计算机工作的进行
    期末总结
    第十四周学习报告
    第十三周学习报告
  • 原文地址:https://www.cnblogs.com/zlshy/p/11934488.html
Copyright © 2011-2022 走看看