骑士走棋盘
个人信息:就读于燕大本科软件工程专业 目前大三;
本人博客: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; } }