求马跳棋盘踏满5*5的国际象棋棋盘有多少种解法?
2017-03-05 11:57
363 查看
题目如图所示。
#include<iostream> #include<cstdio> #define D 8 #define N 5 using namespace std; int chessboard ; int chessboard_copy ; int step[N*N+1]; int step_num=0, result=0, flag=1; static int dx[D]={-2, -1, 1, 2, 2, 1, -1, -2}; static int dy[D]={1, 2, 2, 1, -1, -2, -2, -1}; void show01() { cout<<"按5*5棋盘格式输出:"<<endl; int i, j; for(i=0; i<N; ++i) { for(j=0; j<N; ++j) printf("%-2d ", chessboard[i][j]); cout<<endl; } cout<<endl; } void show() { cout<<"按题目要求输出:"<<endl; int i; cout<<"{ "; for(i=1; i<=N*N; ++i) printf("[%d,%d] ", i, step[i]); cout<<" }"<<endl<<endl; } void horse(int x, int y) { if(x>=0 && x<N && y>=0 && y<N && chessboard[x][y]==0) { //为了按题目输出,step_num是第几步,chessboard_copy[x][y]是棋盘标号 step[++step_num] = chessboard_copy[x][y]; //标记棋盘被访问 chessboard[x][y] = step_num; if(step_num == N*N) { if(flag) { show01(); show(); } //题目要求只输出一个解 flag = 0; result++; } int i; for(i=0; i<D; ++i) { horse(x+dx[i], y+dy[i]); } //回溯 chessboard[x][y] = 0; --step_num; } } int main() { int i, j; //初始化棋盘副本的编号 for(i=0; i<N; ++i) for(j=0; j<N; ++j) chessboard_copy[i][j] = i*N+j+1; horse(0, 0); cout<<"总共解的种数为:"<<result<<endl; return 0; }
相关文章推荐
- 在8X8的棋盘上分布着n个骑士,他们想约在某一个格中聚会。骑士每天可以像国际象棋中的马那样移动一次,可以从中间像8个方向移动(当然不能走出棋盘),请计算n个骑士的最早聚会地点和要走多少天。要求尽早聚会
- 在8X8的棋盘上分布着n个骑士,他们想约在某一个格中聚会。骑士每天可以像国际象棋中的马那样移动一次,可以从中间像8个方向移动(当然不能走出棋盘),请计算n个骑士的最早聚会地点和要走多少天。要求尽早聚会
- 中过象棋棋盘一半 马踏日 从(1,1)出发只能向右踏出,到(m,n)有多少路径
- 在相同的棋盘上面下国际象棋和西洋跳棋(工厂模式)
- joj1445 棋盘上最多放多少马
- LightOJ-1414-February 29--总共多少个闰日?--两种解法
- 【程序9】题目:要求输出国际象棋棋盘
- UVA 11270 Tiling Dominoes(用1×2骨牌覆盖n×m棋盘,有多少种方法)
- JOJ 2474:Tile My Corridor 平铺棋盘 状态压缩解法
- 用java画国际象棋棋盘
- 搜狗笔试题目:4*5的棋盘,在左下角的格子移动到右上角的格子,求有多少种移动方法
- JAVA 关于国际象棋棋盘的扩展
- 放麦子 你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第1个棋盘格放1粒麦子,在第2个棋盘格放2粒麦子,
- 四对括号可以有多少种匹配排列方式-新解法
- 走格子/棋盘问题 有多少条路径可走
- 输出国际象棋棋盘
- poj 1657 国际象棋棋盘上的距离
- JQuery 国际象棋棋盘 实现代码
- PKU 1191 棋盘分割 递归解法
- 在半个中国象棋棋盘上,马在左下角(1,1)处,马走日字,求到指定位置有多少种走法