【数据结构】马踏棋盘问题
来源:互联网 发布:java basicstroke 编辑:程序博客网 时间:2024/05/05 10:09
算法要求:
国际象棋的期盼8X8方格棋盘,将马放在任意的格子中,按照马走棋的规则将马移动,要求每个方格只能进入一次,最终使得马走遍所有的64个方格。
任意位置的马下一步可以走的位置如图所示
//递归和回溯方法实现马踏棋盘#include <stdio.h>#include <time.h>#define X 8#define Y 8int chess[X][Y];//找到基于(x,y)位置的下一个可走的位置int nextxy(int *x, int *y, int count){ switch(count) { case 0: if( *x+2<=X-1 && *y-1>=0 && chess[*x+2][*y-1]==0 ) { *x = *x + 2; *y = *y - 1; return 1; } break; case 1: if( *x+2<=X-1 && *y+1<=Y-1 && chess[*x+2][*y+1]==0 ) { *x = *x + 2; *y = *y + 1; return 1; } break; case 2: if( *x+1<=X-1 && *y-2>=0 && chess[*x+1][*y-2]==0 ) { *x = *x + 1; *y = *y - 2; return 1; } break; case 3: if( *x+1<=X-1 && *y+2<=Y-1 && chess[*x+1][*y+2]==0 ) { *x = *x + 1; *y = *y + 2; return 1; } break; case 4: if( *x-2>=0 && *y-1>=0 && chess[*x-2][*y-1]==0 ) { *x = *x - 2; *y = *y - 1; return 1; } break; case 5: if( *x-2>=0 && *y+1<=Y-1 && chess[*x-2][*y+1]==0 ) { *x = *x - 2; *y = *y + 1; return 1; } break; case 6: if( *x-1>=0 && *y-2>=0 && chess[*x-1][*y-2]==0 ) { *x = *x - 1; *y = *y - 2; return 1; } break; case 7: if( *x-1>=0 && *y+2<=Y-1 && chess[*x-1][*y+2]==0 ) { *x = *x - 1; *y = *y + 2; return 1; } break; default: break; } return 0;}void print(){ int i, j; for( i=0; i < X; i++ ) { for( j=0; j < Y; j++ ) { printf("%2d\t", chess[i][j]); } printf("\n"); } printf("\n");}int TravelChessBoard(int x, int y, int tag){ int x1=x, y1=y, flag=0, count=0; chess[x][y] = tag; if( tag == X*Y ) { print(); return 1; } flag = nextxy(&x1, &y1, count); while( 0==flag && count < 7 ) { count++; flag = nextxy(&x1, &y1, count); } while( flag ) { if( TravelChessBoard(x1, y1, tag+1) ) { return 1; } x1 = x; y1 = y; count++; flag = nextxy(&x1, &y1, count); while( 0==flag && count < 7 ) { count++; flag = nextxy(&x1, &y1, count); } } if( 0 == flag ) { chess[x][y] = 0; } return 0;}int main(){ int i, j; clock_t start, finish; start = clock(); for( i=0; i < X; i++ ) { for( j=0; j < Y; j++ ) { chess[i][j] = 0; } } if( !TravelChessBoard(2, 0, 1) ) { printf("抱歉!马踏棋盘失败了\n"); } finish = clock(); printf("本次计算一共耗时: %f秒\n\n", (double)(finish-start)/CLOCKS_PER_SEC); return 0;}
打印结果如下:
(耗时操作,更换初始位置可能会造成计算时间更长,请耐心等待!!!!)
0 0
- 【数据结构】马踏棋盘问题
- 【数据结构】马踏棋盘的遍历问题
- 【马踏棋盘】 数据结构
- 数据结构---马踏棋盘
- 【数据结构】关于马踏棋盘(8皇后问题)
- C语言-数据结构-骑士周游-马踏棋盘问题-源代码
- 数据结构之马踏棋盘
- 马踏棋盘问题
- 马踏棋盘问题
- 马踏棋盘问题
- 马踏棋盘问题
- 马踏棋盘问题
- 马踏棋盘问题
- 马踏棋盘问题
- 马踏棋盘问题
- 数据结构与算法10:马踏棋盘问题(骑士周游问题)
- 转:数据结构与算法1:马踏棋盘问题(骑士周游问题)
- 马(糟)踏棋盘问题
- 怀旧滤波
- 主流浏览器的内核以及Hack写法
- UML 构件图(组件图)
- 数据库锁表解决方法
- 线程的礼让(Thread.yield())方法
- 【数据结构】马踏棋盘问题
- redis windows下使用及redis命令
- android 自定义类似91游,360应用内悬浮球(不使用系统悬浮框)
- Android内存泄漏分析与总结
- 【bzoj 1934】[Shoi2007]Vote 善意的投票 最小割
- poi将数据库表内容导出到excel
- 入门Webpack,看这篇就够了
- 禁止双击标题栏最大化&还原
- scheme递归和迭代的效率测试