• 马的遍历问题



    在10*9的中国象棋的棋盘中,马只能走“日”字,不考虑蹩脚。马从任意位置处出发,把棋盘的每一格都走一次,且只走一次,设计程序求解。



    // horse_traverse.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include<vector>
    #include<iostream>
    
    using namespace std;
    
    typedef unsigned char BYTE;
    //#define Width 9
    //#define Height 10
    #define Width 6
    #define Height 6
    struct Position
    {
    	BYTE x;
    	BYTE y;
    };
    
    
    int map[Height][Width] = { 0 };
    vector<vector<Position>>record;
    vector<Position>solution;
    bool valid_shift(BYTE x, BYTE y)
    {
    	vector<Position>aa;
    	Position pos;
    	
    	if (x + 1 < Width&&y - 2 >= 0 && map[y-2][x+1] == 0)//direct 0
    	{
    		pos.x = x + 1;
    		pos.y = y - 2;
    		aa.push_back(pos);
    	}
    	if (x + 2 < Width&&y - 1 >= 0 && map[y-1][x+2] == 0)//direct 1
    	{
    		pos.x = x + 2;
    		pos.y = y - 1;
    		aa.push_back(pos);
    		
    	}
    	if (x + 2 < Width&&y + 1 < Height && map[y+1][x+2] == 0)//direct 2
    	{
    		pos.x = x + 2;
    		pos.y = y +1;
    		aa.push_back(pos); 
    	}
    	if (x + 1 < Width&&y + 2 < Height && map[y+2][x+1] == 0)//direct 3
    	{
    		pos.x = x + 1;
    		pos.y = y +2;
    		aa.push_back(pos);
    	}
    	if (x - 1 >= 0 && y + 2 < Height && map[y+2][x-1] == 0)//direct 4
    	{
    		pos.x = x -1;
    		pos.y = y + 2;
    		aa.push_back(pos); 
    	}
    	if (x - 2 >= 0 && y + 1 < Height && map[y+1][x-2] == 0)//direct 5
    	{
    		pos.x = x -2;
    		pos.y = y + 1;
    		aa.push_back(pos); 
    	}
    	if (x - 2 >= 0 && y -1 >= 0 && map[y-1][x-2] == 0)//direct 4
    	{
    		pos.x = x - 2;
    		pos.y = y -1;
    		aa.push_back(pos);
    	}
    	if (x - 1 >= 0 && y - 2 >= 0 && map[y-2][x-1] == 0)//direct 4
    	{
    		pos.x = x - 1;
    		pos.y = y - 2;
    		aa.push_back(pos);
    	}
    	if (!aa.empty())
    	{
    		record.push_back(aa);
    		return true;
    	}
    	return false;
    }
    
    bool isSuccess()
    {
    	int sum = 0;
    	vector<vector<Position>>::iterator it;
    	for (int i = 0; i < Width; i++)
    		for (int j = 0; j < Height; j++)
    		{
    		sum += map[j][i];
    		}
    	it = record.end() - 1;
    	int x = (*((*it).end() - 1)).x;
    	int y = (*((*it).end() - 1)).y;
    	if (sum == Width*Height - 1 && map[y][x] == 0)
    		return true;
    	return false;
    
    }
    
    
    bool horse_traverse(BYTE x, BYTE y)
    {
    
    	Position pos;
    	vector<vector<Position>>::iterator it;
    	vector<Position>::iterator it1, it2;
    	map[y][x] = 1;
    	valid_shift(x, y);
    	while (!record.empty())
    	{
    		it = record.end() - 1;
    		it1 = (*it).end() - 1;
    		bool flag = false;
    		while (!valid_shift((*it1).x, (*it1).y))
    		{
    			(*it).pop_back();
    			if ((*it).empty())
    			{
    				while ((*it).empty())
    				{
    					record.pop_back();
    					if (record.empty())
    					{
    						return false;
    					}
    					it = record.end() - 1;
    					(*it).pop_back();
    					it2 = solution.end() - 1;
    					map[(*it2).y][(*it2).x] = 0;
    					solution.pop_back();
    				}
    				
    				flag = true;
    				break;
    			}
    			it1 = (*it).end() - 1;
    		}
    		if (!flag)
    		{
    			it = record.end() - 1;
    			bool flag1 = false;
    			if ((*it).size() == 1 && (*(it - 1)).size() == 1)//这里要防止马在两个格子之间来回跳的情况发生
    			{
    				vector<Position>aa;
    				Position pos;
    
    				int x = (*it)[0].x;
    				int y = (*it)[0].y;
    				map[(*(it - 1))[0].y][(*(it - 1))[0].x] = 1;
    				if (x + 1 < Width&&y - 2 >= 0 && map[y - 2][x + 1] == 0)//direct 0
    				{
    					pos.x = x + 1;
    					pos.y = y - 2;
    					aa.push_back(pos);
    
    				}
    				if (x + 2 < Width&&y - 1 >= 0 && map[y - 1][x + 2] == 0)//direct 1
    				{
    					pos.x = x + 2;
    					pos.y = y - 1;
    					aa.push_back(pos);
    
    				}
    				if (x + 2 < Width&&y + 1 < Height && map[y + 1][x + 2] == 0)//direct 2
    				{
    					pos.x = x + 2;
    					pos.y = y + 1;
    					aa.push_back(pos);
    				}
    				if (x + 1 < Width&&y + 2 < Height && map[y + 2][x + 1] == 0)//direct 3
    				{
    					pos.x = x + 1;
    					pos.y = y + 2;
    					aa.push_back(pos);
    				}
    				if (x - 1 >= 0 && y + 2 < Height && map[y + 2][x - 1] == 0)//direct 4
    				{
    					pos.x = x - 1;
    					pos.y = y + 2;
    					aa.push_back(pos);
    				}
    				if (x - 2 >= 0 && y + 1 < Height && map[y + 1][x - 2] == 0)//direct 5
    				{
    					pos.x = x - 2;
    					pos.y = y + 1;
    					aa.push_back(pos);
    				}
    				if (x - 2 >= 0 && y - 1 >= 0 && map[y - 1][x - 2] == 0)//direct 6
    				{
    					pos.x = x - 2;
    					pos.y = y - 1;
    					aa.push_back(pos);
    				}
    				if (x - 1 >= 0 && y - 2 >= 0 && map[y - 2][x - 1] == 0)//direct 7
    				{
    					pos.x = x - 1;
    					pos.y = y - 2;
    					aa.push_back(pos);
    				}
    
    				if (aa.size() == 1 && aa[0].x == (*(it - 1))[0].x&&aa[0].y == (*(it - 1))[0].y)
    				{
    					record.pop_back();
    					record.pop_back();
    					it = record.end() - 1;
    					(*it).pop_back();
    					if ((*it).size() == 0)
    						record.pop_back();
    					it1 = solution.end() - 1;
    					map[(*it1).y][(*it1).x] = 0;
    					solution.pop_back();
    					flag1 = true;
    				}
    
    			}
    			if (!flag1)
    			{
    				solution.push_back(*it1);
    				map[(*it1).y][(*it1).x] = 1;
    			}
    		}
    		if (isSuccess())
    		{
    			it = record.end() - 1;
    			solution.push_back(*((*it).end() - 1));
    			return true;
    		}
    	}
    
    
    }
    
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	horse_traverse(0, 2);
    	
    	system("pause");
    	return 0;
    }
    


    没有优化,计算量惊人。

    开始以为程序有问题导致陷入死循环,后来发现可以运行得出结果,只是太!!!慢!!!了!!!!!!!!!!!!!!!!!

    后面有时间重新写一个。



    版权声明:

  • 相关阅读:
    企业应用架构研究系列三:应用系统集成
    企业应用架构研究系列十九:Docker开发环境
    企业应用架构研究系列二十:创建&发布Docker
    前端NEXT实践系列:(一)ECMAScript 6.0技术栈
    企业应用架构研究系列二十七:Vue3.0 之环境的搭建与Vue Antd Admin探索
    企业应用架构研究系列五:极限编程(XP)& 敏捷管理(Scrum)
    记一次HIV初筛假阳性的经历
    C#发送邮件
    Ubuntu允许root登录
    lerna学习
  • 原文地址:https://www.cnblogs.com/walccott/p/4956892.html
Copyright © 2020-2023  润新知