马的遍历问题


在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;
}


没有优化,计算量惊人。

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

后面有时间重新写一个。



版权声明:

posted on 2015-07-28 01:01  moffis  阅读(598)  评论(0编辑  收藏  举报

导航