骑士走棋盘 栈的应用篇

骑士走棋盘

个人信息:就读于燕大本科软件工程专业 目前大三;

本人博客:google搜索“cqs_2012”即可;

个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献;

博客内容:骑士走棋盘;

博客时间:2014-4-12;

编程语言:C++ ;

编程坏境:Windows 7 专业版 x64;

编程工具:vs2008 32位编译器;

制图工具:office 2010 ppt;

硬件信息:7G-3 笔记本;

 

引言

不坚持后果不用想,不要总说坚持才会胜利。

题目

骑士走棋盘:

问题描述:中国象棋中,马可以走遍棋盘上的任何角落.国际象棋中,也同样有这样的说法:骑士可以走遍棋盘上的每个格子.现在的问题是:在一个8x8的棋盘上,从任意位置开始,骑士如何可以不重复地走完所有的位置?

 

思路

回速算法,应用工具 栈

骑士走棋盘 的定义是从棋盘任何一个格子开始都行,然尔我只写了从棋盘最左上角开始的,没有写从每一个格子开始的程序。

其实我感觉也是没有必要的,因为棋盘式高度对称的,不严格的说从1/8 的总格子数目的一个角上开始就行。

本题例子我用了一个3x3的棋盘,没有用8x8的棋盘,其实骑士走法思路是一样的,只是棋盘大小不同

骑士每一次要做的选择有两种

1,前进:留下脚印,继续有规则地寻找可以前进的方向

2.后退:若是当前周围8个方向都已经走过,而且没有走完,则就后退,并擦去脚印

这种操作不断循环,直至棋盘都走完,或者回到起点。

实验

3x3 格子

从最左上角1个格子任意开始,可以走完棋盘的方案如下,一共有 138 种方案可以从开始端不重复的走完棋盘

 

solution follows1
2 0
1 0
2 1
2 2
1 2
1 1
0 2
0 1
0 0
solution follows2
1 0
2 0
2 1
2 2
1 2
1 1
0 2
0 1
0 0
solution follows3
1 2
2 2
2 1
2 0
1 0
1 1
0 2
0 1
0 0
solution follows4
2 2
1 2
2 1
2 0
1 0
1 1
0 2
0 1
0 0
solution follows5
1 2
2 2
2 1
1 0
2 0
1 1
0 2
0 1
0 0
solution follows6
2 2
1 2
2 1
1 0
2 0
1 1
0 2
0 1
0 0
solution follows7
2 0
1 0
2 1
1 2
2 2
1 1
0 2
0 1
0 0
solution follows8
1 0
2 0
2 1
1 2
2 2
1 1
0 2
0 1
0 0
solution follows9
2 2
2 1
2 0
1 0
1 1
1 2
0 2
0 1
0 0
solution follows10
2 2
2 1
1 0
2 0
1 1
1 2
0 2
0 1
0 0
solution follows11
2 0
1 0
2 1
2 2
1 1
1 2
0 2
0 1
0 0
solution follows12
1 0
2 0
2 1
2 2
1 1
1 2
0 2
0 1
0 0
solution follows13
2 0
1 0
1 1
2 2
2 1
1 2
0 2
0 1
0 0
solution follows14
1 0
2 0
1 1
2 2
2 1
1 2
0 2
0 1
0 0
solution follows15
2 2
1 1
2 0
1 0
2 1
1 2
0 2
0 1
0 0
solution follows16
2 2
1 1
1 0
2 0
2 1
1 2
0 2
0 1
0 0
solution follows17
2 1
2 0
1 0
1 1
2 2
1 2
0 2
0 1
0 0
solution follows18
2 0
2 1
1 0
1 1
2 2
1 2
0 2
0 1
0 0
solution follows19
1 0
2 1
2 0
1 1
2 2
1 2
0 2
0 1
0 0
solution follows20
2 1
1 0
2 0
1 1
2 2
1 2
0 2
0 1
0 0
solution follows21
2 0
1 0
2 1
1 1
2 2
1 2
0 2
0 1
0 0
solution follows22
1 0
2 0
2 1
1 1
2 2
1 2
0 2
0 1
0 0
solution follows23
2 0
1 0
1 1
2 1
2 2
1 2
0 2
0 1
0 0
solution follows24
1 0
2 0
1 1
2 1
2 2
1 2
0 2
0 1
0 0
solution follows25
2 0
1 1
1 0
2 1
2 2
1 2
0 2
0 1
0 0
solution follows26
1 1
2 0
1 0
2 1
2 2
1 2
0 2
0 1
0 0
solution follows27
1 0
1 1
2 0
2 1
2 2
1 2
0 2
0 1
0 0
solution follows28
1 1
1 0
2 0
2 1
2 2
1 2
0 2
0 1
0 0
solution follows29
2 0
2 1
2 2
1 2
0 2
1 1
1 0
0 1
0 0
solution follows30
0 2
1 2
2 2
2 1
2 0
1 1
1 0
0 1
0 0
solution follows31
1 1
0 2
1 2
2 2
2 1
2 0
1 0
0 1
0 0
solution follows32
0 2
1 1
1 2
2 2
2 1
2 0
1 0
0 1
0 0
solution follows33
0 2
1 2
1 1
2 2
2 1
2 0
1 0
0 1
0 0
solution follows34
1 2
0 2
1 1
2 2
2 1
2 0
1 0
0 1
0 0
solution follows35
2 2
1 1
0 2
1 2
2 1
2 0
1 0
0 1
0 0
solution follows36
0 2
1 1
2 2
1 2
2 1
2 0
1 0
0 1
0 0
solution follows37
2 2
1 2
0 2
1 1
2 1
2 0
1 0
0 1
0 0
solution follows38
0 2
1 2
2 2
1 1
2 1
2 0
1 0
0 1
0 0
solution follows39
2 2
2 1
1 2
0 2
1 1
2 0
1 0
0 1
0 0
solution follows40
2 1
2 2
1 2
0 2
1 1
2 0
1 0
0 1
0 0
solution follows41
0 2
1 2
2 2
2 1
1 1
2 0
1 0
0 1
0 0
solution follows42
0 2
1 2
2 1
2 2
1 1
2 0
1 0
0 1
0 0
solution follows43
2 0
1 1
0 2
1 2
2 2
2 1
1 0
0 1
0 0
solution follows44
2 2
1 2
0 2
1 1
2 0
2 1
1 0
0 1
0 0
solution follows45
0 2
1 2
2 2
1 1
2 0
2 1
1 0
0 1
0 0
solution follows46
2 0
1 0
2 1
2 2
1 2
0 2
1 1
0 1
0 0
solution follows47
1 0
2 0
2 1
2 2
1 2
0 2
1 1
0 1
0 0
solution follows48
0 2
1 2
2 2
2 1
2 0
1 0
1 1
0 1
0 0
solution follows49
0 2
1 2
2 2
2 1
1 0
2 0
1 1
0 1
0 0
solution follows50
2 2
2 1
2 0
1 0
1 1
0 2
1 2
0 1
0 0
solution follows51
2 2
2 1
1 0
2 0
1 1
0 2
1 2
0 1
0 0
solution follows52
2 0
1 0
2 1
2 2
1 1
0 2
1 2
0 1
0 0
solution follows53
1 0
2 0
2 1
2 2
1 1
0 2
1 2
0 1
0 0
solution follows54
0 2
1 1
2 0
1 0
2 1
2 2
1 2
0 1
0 0
solution follows55
0 2
1 1
1 0
2 0
2 1
2 2
1 2
0 1
0 0
solution follows56
2 0
2 1
2 2
1 2
0 1
0 2
1 1
1 0
0 0
solution follows57
2 0
2 1
2 2
1 2
0 2
0 1
1 1
1 0
0 0
solution follows58
0 1
0 2
1 2
2 2
2 1
2 0
1 1
1 0
0 0
solution follows59
0 2
0 1
1 2
2 2
2 1
2 0
1 1
1 0
0 0
solution follows60
2 0
2 1
2 2
1 2
1 1
0 2
0 1
1 0
0 0
solution follows61
1 2
2 2
2 1
2 0
1 1
0 2
0 1
1 0
0 0
solution follows62
2 2
1 2
2 1
2 0
1 1
0 2
0 1
1 0
0 0
solution follows63
2 0
2 1
1 2
2 2
1 1
0 2
0 1
1 0
0 0
solution follows64
2 2
2 1
2 0
1 1
1 2
0 2
0 1
1 0
0 0
solution follows65
2 0
2 1
2 2
1 1
1 2
0 2
0 1
1 0
0 0
solution follows66
2 0
1 1
2 2
2 1
1 2
0 2
0 1
1 0
0 0
solution follows67
2 2
1 1
2 0
2 1
1 2
0 2
0 1
1 0
0 0
solution follows68
2 1
2 0
1 1
2 2
1 2
0 2
0 1
1 0
0 0
solution follows69
2 0
2 1
1 1
2 2
1 2
0 2
0 1
1 0
0 0
solution follows70
2 0
1 1
2 1
2 2
1 2
0 2
0 1
1 0
0 0
solution follows71
1 1
2 0
2 1
2 2
1 2
0 2
0 1
1 0
0 0
solution follows72
2 0
2 1
2 2
1 2
0 2
1 1
0 1
1 0
0 0
solution follows73
0 2
1 2
2 2
2 1
2 0
1 1
0 1
1 0
0 0
solution follows74
2 2
2 1
2 0
1 1
0 2
1 2
0 1
1 0
0 0
solution follows75
2 0
2 1
2 2
1 1
0 2
1 2
0 1
1 0
0 0
solution follows76
0 2
1 1
2 0
2 1
2 2
1 2
0 1
1 0
0 0
solution follows77
1 1
0 1
0 2
1 2
2 2
2 1
2 0
1 0
0 0
solution follows78
0 1
1 1
0 2
1 2
2 2
2 1
2 0
1 0
0 0
solution follows79
1 1
0 2
0 1
1 2
2 2
2 1
2 0
1 0
0 0
solution follows80
0 2
1 1
0 1
1 2
2 2
2 1
2 0
1 0
0 0
solution follows81
0 1
0 2
1 1
1 2
2 2
2 1
2 0
1 0
0 0
solution follows82
0 2
0 1
1 1
1 2
2 2
2 1
2 0
1 0
0 0
solution follows83
0 1
0 2
1 2
1 1
2 2
2 1
2 0
1 0
0 0
solution follows84
0 2
0 1
1 2
1 1
2 2
2 1
2 0
1 0
0 0
solution follows85
1 2
0 1
0 2
1 1
2 2
2 1
2 0
1 0
0 0
solution follows86
0 1
1 2
0 2
1 1
2 2
2 1
2 0
1 0
0 0
solution follows87
1 2
0 2
0 1
1 1
2 2
2 1
2 0
1 0
0 0
solution follows88
0 2
1 2
0 1
1 1
2 2
2 1
2 0
1 0
0 0
solution follows89
2 2
1 1
0 1
0 2
1 2
2 1
2 0
1 0
0 0
solution follows90
2 2
1 1
0 2
0 1
1 2
2 1
2 0
1 0
0 0
solution follows91
0 1
0 2
1 1
2 2
1 2
2 1
2 0
1 0
0 0
solution follows92
0 2
0 1
1 1
2 2
1 2
2 1
2 0
1 0
0 0
solution follows93
2 2
1 2
0 1
0 2
1 1
2 1
2 0
1 0
0 0
solution follows94
2 2
1 2
0 2
0 1
1 1
2 1
2 0
1 0
0 0
solution follows95
0 1
0 2
1 2
2 2
1 1
2 1
2 0
1 0
0 0
solution follows96
0 2
0 1
1 2
2 2
1 1
2 1
2 0
1 0
0 0
solution follows97
2 2
2 1
1 2
0 1
0 2
1 1
2 0
1 0
0 0
solution follows98
2 1
2 2
1 2
0 1
0 2
1 1
2 0
1 0
0 0
solution follows99
2 2
2 1
1 2
0 2
0 1
1 1
2 0
1 0
0 0
solution follows100
2 1
2 2
1 2
0 2
0 1
1 1
2 0
1 0
0 0
solution follows101
0 1
0 2
1 2
2 2
2 1
1 1
2 0
1 0
0 0
solution follows102
0 2
0 1
1 2
2 2
2 1
1 1
2 0
1 0
0 0
solution follows103
0 1
0 2
1 2
2 1
2 2
1 1
2 0
1 0
0 0
solution follows104
0 2
0 1
1 2
2 1
2 2
1 1
2 0
1 0
0 0
solution follows105
2 0
1 1
0 1
0 2
1 2
2 2
2 1
1 0
0 0
solution follows106
2 0
1 1
0 2
0 1
1 2
2 2
2 1
1 0
0 0
solution follows107
2 2
1 2
0 1
0 2
1 1
2 0
2 1
1 0
0 0
solution follows108
2 2
1 2
0 2
0 1
1 1
2 0
2 1
1 0
0 0
solution follows109
0 1
0 2
1 2
2 2
1 1
2 0
2 1
1 0
0 0
solution follows110
0 2
0 1
1 2
2 2
1 1
2 0
2 1
1 0
0 0
solution follows111
2 2
2 1
2 0
1 0
0 1
0 2
1 2
1 1
0 0
solution follows112
0 2
0 1
1 0
2 0
2 1
2 2
1 2
1 1
0 0
solution follows113
1 2
2 2
2 1
2 0
1 0
0 1
0 2
1 1
0 0
solution follows114
2 2
1 2
2 1
2 0
1 0
0 1
0 2
1 1
0 0
solution follows115
2 0
1 0
2 1
2 2
1 2
0 1
0 2
1 1
0 0
solution follows116
1 0
2 0
2 1
2 2
1 2
0 1
0 2
1 1
0 0
solution follows117
2 2
2 1
2 0
1 0
0 1
1 2
0 2
1 1
0 0
solution follows118
0 1
1 0
2 0
2 1
2 2
1 2
0 2
1 1
0 0
solution follows119
2 0
1 0
2 1
2 2
1 2
0 2
0 1
1 1
0 0
solution follows120
1 0
2 0
2 1
2 2
1 2
0 2
0 1
1 1
0 0
solution follows121
0 2
1 2
2 2
2 1
2 0
1 0
0 1
1 1
0 0
solution follows122
2 0
2 1
2 2
1 2
0 2
0 1
1 0
1 1
0 0
solution follows123
0 1
0 2
1 2
2 2
2 1
2 0
1 0
1 1
0 0
solution follows124
0 2
0 1
1 2
2 2
2 1
2 0
1 0
1 1
0 0
solution follows125
1 0
0 1
0 2
1 2
2 2
2 1
2 0
1 1
0 0
solution follows126
2 2
1 2
0 2
0 1
1 0
2 1
2 0
1 1
0 0
solution follows127
2 2
2 1
1 2
0 2
0 1
1 0
2 0
1 1
0 0
solution follows128
2 1
2 2
1 2
0 2
0 1
1 0
2 0
1 1
0 0
solution follows129
0 1
0 2
1 2
2 2
2 1
1 0
2 0
1 1
0 0
solution follows130
0 2
0 1
1 2
2 2
2 1
1 0
2 0
1 1
0 0
solution follows131
2 0
1 0
0 1
0 2
1 2
2 2
2 1
1 1
0 0
solution follows132
2 2
1 2
0 2
0 1
1 0
2 0
2 1
1 1
0 0
solution follows133
2 1
2 0
1 0
0 1
0 2
1 2
2 2
1 1
0 0
solution follows134
2 0
2 1
1 0
0 1
0 2
1 2
2 2
1 1
0 0
solution follows135
0 2
0 1
1 0
2 0
2 1
1 2
2 2
1 1
0 0
solution follows136
2 0
1 0
0 1
0 2
1 2
2 1
2 2
1 1
0 0
solution follows137
1 2
0 2
0 1
1 0
2 0
2 1
2 2
1 1
0 0
solution follows138
0 2
1 2
0 1
1 0
2 0
2 1
2 2
1 1
0 0


代码

test.cpp

#include<iostream>
#include<stack>
#include<fstream>
#include<utility>
using namespace std;


// function: output path
// input: a stack <int,int> and a file point
// output: void
// 功能: 输出结果路径
void _Output_path(stack<std::pair<int,int>> result,ofstream &writer,int n);

// function: knight tour
// input: the size with n
// output: void
// 功能: 骑士走棋盘
void _Knight_tour(int n);

int main()
{
	int n;
	cout<<"请输入棋盘规模"<<endl;
	while(cin>>n)
	{
		_Knight_tour(n);
		cout<<"result has been saved within the file knight_tour"<<endl;
		cout<<"请输入新的棋盘规模"<<endl;
	}
	system("pause") ;
	return 0 ;
}

// function: knight tour
// input: the size with n
// output: void
// 功能: 骑士走棋盘
void _Knight_tour(int n)
{
	if( n > 0 )
	{
		if( n == 1 )
		{
			cout<<"find path"<<endl;
		}
		else
		{
			// first action: make chessboard
			bool ** chessboard = new bool*[n] ;
			for(int i = 0; i<n; i++)
			{
				chessboard[i] = new bool[n] ;
				for(int j=0; j<n; j++)
				{
					chessboard[i][j] = false ;
				}
			}

			// second action: tour
			int solution_number = 1;
			ofstream writer;
			writer.open("knight_tour.txt");
			writer.clear();
			std::pair<int,int> top;
			stack<std::pair<int,int>> result;
			stack<int> dir;
			int d = 0;
			result.push(std::make_pair(0,0));
			chessboard[0][0] = true;
			while(! result.empty())
			{
				// go on
				top = result.top();
				if(result.size() == n*n)
				{
					// output result path
					_Output_path(result,writer,solution_number++);
					goto POP;
				}
				else if( top.second < n - 1 && chessboard[top.first][top.second+1] == false && d <= 0)
				{
					result.push(std::make_pair(top.first,top.second+1));
					chessboard[top.first][top.second+1] = true;
					dir.push(1);// 0
					d = 0;
				}
				else if(top.second < n - 1 && top.first > 0 && chessboard[top.first-1][top.second+1] == false && d<=1)
				{
					result.push(std::make_pair(top.first-1,top.second+1));
					chessboard[top.first-1][top.second+1] = true;
					dir.push(2);// 45
					d = 0;
				}
				else if(top.first > 0 && chessboard[top.first-1][top.second] == false && d<=2)
				{
					result.push(std::make_pair(top.first-1,top.second));
					chessboard[top.first-1][top.second] = true;
					dir.push(3);// 90
					d = 0;
				}
				else if(top.first > 0 && top.second > 0 && chessboard[top.first-1][top.second-1] == false && d<=3)
				{
					result.push(std::make_pair(top.first-1,top.second-1));
					chessboard[top.first-1][top.second-1] = true;
					dir.push(4);// 135
					d = 0;
				}
				else if(top.second > 0 && chessboard[top.first][top.second-1] == false && d<=4)
				{
					result.push(std::make_pair(top.first,top.second-1));
					chessboard[top.first][top.second-1] = true;
					dir.push(5);// 180
					d = 0;
				}
				else if(top.first< n-1 && top.second > 0 && chessboard[top.first+1][top.second-1] == false && d<=5)
				{
					result.push(std::make_pair(top.first+1,top.second-1));
					chessboard[top.first+1][top.second-1] = true;
					dir.push(6);// -135
					d = 0;
				}
				else if(top.first<n-1 && chessboard[top.first+1][top.second] == false && d<=6)
				{
					result.push(std::make_pair(top.first+1,top.second));
					chessboard[top.first+1][top.second] = true;
					dir.push(7);// -90		
					d = 0;
				}
				else if(top.first < n-1 && top.second < n-1 && chessboard[top.first+1][top.second+1] == false && d<=7)
				{
					result.push(std::make_pair(top.first+1,top.second+1)) ;
					chessboard[top.first+1][top.second+1] = true ;
					dir.push(8) ;// -45	
					d = 0 ;
				}
				else if( !result.empty() )
				{
					POP:
					chessboard[top.first][top.second] = false ;
					result.pop();
					if(! dir.empty())
					{
						d = dir.top();
						dir.pop();
					}
				}
			}
			cout<<"no else solution"<<endl;
			writer.close();
		}
	}
	else
	{
		cout<<"exception of function _Knight_tour input"<<endl;
	}
}


// function: output path
// input: a stack <int,int> and a file point
// output: void
// 功能: 输出结果路径
void _Output_path(stack<std::pair<int,int>> result,ofstream &writer,int n)
{
	std::pair<int,int> top ;
	writer<<"solution follows"<<n<<endl;
	while(! result.empty())
	{
		top = result.top();
		result.pop();
		writer<<top.first<<" "<<top.second<<endl;
	}
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值