题目:
在一个4X5的棋盘上,马的起始坐标由用户输入,求马返回初始位置的所有不同的走法的总数和步骤。马走过的位置不能重复。
//Chess.h #include class Chess int FindPath(int startx, int starty); const static int stepx[8]; int ** chess; struct Pos { Pos startp; void jump(int posx, int posy, int &count, vector &path); |
//Chess.cpp #include "Chess.h" const int Chess::stepx[8]={-2, -1, 1, 2, 2, 1, -1, -2}; int Chess::FindPath(int startx, int starty) void Chess::jump(int posx, int posy, int &count, vector &path) |
//main #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) |
汉诺塔是源自印度神话里的玩具。上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
从最简单的方式考虑,当仅仅有两个盘子的时候,移动过程应该如下:
当有多个盘子的时候,把除最后一个盘子以外的其他盘子看成一个整体,应用递归进行移动,过程如下:
所以得出汉诺塔的算法如下:
void hanoi(int count, char pillarA, char pillarB, char pillarC) |
双层汉诺塔问题:双层汉诺塔是由单层汉诺塔衍生出来,相同大小的盘都有颜色不同的两片,其目的是将不同颜色的盘分别移动到右面的两个柱子上。在移动过程中,依旧是遵守大盘必须在小盘之下,而颜色顺序无限制。
当仅仅又四个盘子的情况如下:
当有多个盘子的时候,把除最后两个盘子以外的其他盘子看成一个整体,应用递归进行移动,过程如下:
双层汉诺塔实现算法如下:
void hanoi(int numofpairs, char pillarA, char pillarB, char pillarC) |
骑士的走法为走日字,骑士从任意位置出发,求他要如何才能走完所有的位置。
骑士的走法,基本上可以用递归来解决,然而纯粹的递归维度很大,很没有效率,从而应用A*算法,骑士没选择下一步,优先走再下一步所能走的步数最少的一步,也即先将最难的位置走完。
//knight.h class knight ~knight() int travel(int startx, int starty); void output() const static int stepx[8]; |
//knight.cpp #include "knight.h" const int knight::stepx[8] = {-2, -1, 1, 2, 2, 1, -1, -2}; int knight::travel(int startx, int starty) vector nextx; int currentx = startx; int; int tmp = nextsteps[0]; currentx = nextx[selected]; int main(int argc, char ** argv){ knight k(3, 3); |
老鼠走迷宫,用二维矩阵中,用2表示墙壁,用1表示老鼠的行走路径,求由入口至出口的路径。
老鼠的走法有上下左右四个方向,每次选择一个方向前进,当无法前进的时候,退回选择下一个方向前进,直到走到出口为止。
由于迷宫的设计,老鼠走迷宫的入口到出口的路径可能不止一条,如何求出所有的路径?
求所有的路径其实很简单,只要在老鼠走到出口的时候不退出,仅仅显示经过的路径,然后退回上一个重新选择下一个位置就可以了。
class MouseMaze int visit(int x, int y) int success = FALSE; if (success == FALSE) return success; void visitAll(int x, int y) if (x+1 < width && maze[(x+1)*width+y]== 0) maze[x*width + y]= 0; void output() for (int i = 0; i < width; i++) printf("-------------------------------------------------------------/n"); protected: int _tmain(int argc, _TCHAR* argv[]) MouseMaze m(&maze[0][0], 9, 9, 1, 1, 7, 7); |
假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,要求将旗子排列为蓝,白,红的顺序,要如何移动,才最少。一次只能调换两个旗子。
设定一个队列,B,W,R是三种旗子的分界标,初始时,B,W在队首,R在队尾,然后从队首逐个扫描:
void swap(char &a, char &b) void colorflags(char* &flags, int length) |
国际象棋中,皇后可以横,竖,斜直线前进,吃掉所有的棋子,如果棋盘上有八个皇后,如何放置才能使八个皇后相安无事。
class Queen ~Queen() void output() void placeQueen(int i) int _tmain(int argc, _TCHAR* argv[]) |