黑龙江大学期末考试卷目整理.docxVIP

  • 65
  • 0
  • 约1.08万字
  • 约 9页
  • 2019-08-04 发布于福建
  • 举报
PAGE9 / NUMPAGES9 目录 TOC \o 1-3 \h \z \u 2-2 马的Hamilton周游路线问题 1 2-5.有重复元素的排列问题 3 2-6排列的字典序问题 4 2-7集合划分问题 5 4-1 会场安排问题 6 4-3 磁带最优存储问题 7 2-2 马的Hamilton周游路线问题 问题描述: 马的Hamilton周游路线问题*问题描述:8x8的国际象棋棋盘上的一只马,恰好走过除起点外的其它63个位置各一次,最后回到起点。这条路线称为一条马的Hamilton周游路线。对于给定的mxn的国际象棋棋盘, m和n均为大于5的偶数,且m-nl2,试设计一个分治算法找出一条马的Hamilton周游路线。 编程任务: 对于给定的偶数m, n6,且m-nl2,编程计算mxn的国际象棋棋盘一条马的Hamilton周游路线。 数据输入: 由文件input.txt给出输入数据。第一行有2个正整数m和n,表示给定的国际象棋棋盘由m行,每行n个格子组成。 结果输出: 程序运行结束时,将计算出的马的Hamilton周游路线用下面的2种表达方式输出到文件 output.txt中. 第1种表达方式按照马步的次序给出马的Hamilton周游路线。马的每一步用所在的方格坐标(x, y)来表示。x表示行的坐标,编号为0, 1, ..., m-1; y表示列的坐标,编号为0, 1, …, n-1,起始方格为(0, 0). 第2种表达方式在棋盘的方格中标明马到达该方格的步数。(0, 0)方格为起跳步,并明为第1步。 答案解析: 考虑到马有8种走法 ????int dx[8]={-2,-1,1,2,-2,-1,2,1}; ????int dy[8]={-1,-2,-2,-1,1,2,1,2}; ? ? 之后就让马根据这八种走法来走不过还要考虑下面3种情况 ? ? 第一种情况: ????如果马的下一步走法已经超出棋盘的范围了那么就不应该让马接下来走这一步转而去考虑其他的走法 ? ? 第二种情况: ?????如果马的下一步是已经走过的那么就不应该让马接下来走这一步转而去考虑其他的走法 ? ? 第三种情况: 如果马能够遍历完棋盘,那么就要考虑其最后一步是否可以通过上述的八种走法中的一种到达最开始的一步 //算法实现 #include stdio.h #include stdlib.h #include iostream using namespace std; #define max 101 int count = 0; int m,n;//棋盘大小 int start_x,start_y;//起点位置 //考虑到马有8种走法 int dx[8]={-2,-1,1,2,-2,-1,2,1}; int dy[8]={-1,-2,-2,-1,1,2,1,2}; int board[max][max]={0}; //输出棋盘 void show(int m,int n){ for(int i = 0;im;i++){ for(int j = 0;jn;j++){ coutboard[i][j] ; } coutendl; } } //判断下一步是否是起始的位置 int next_move(int x,int y){ for(int i = 0;i8;i++){ if(board[x+dx[i]][y+dy[i]] == 1){//1表示马的起始位置 return 1; } } return 0; } //判断是否填了 int finish(int x,int y){ if(board[x][y] == 0){//0表示马没有走过 非0表示马已经走过 return 1; } return 0; } //马的下一步走法已经超出棋盘的范围了 int judge(int x,int y,int m,int n){ if(x=0xmy=0yn){ return 1; } return 0; } //马走的函数 void move(int x,int y,int num){ if(num == m*n+1next_move(x,y)){ cout++countendl; show(m,n);//输出棋盘 coutendl; return ; }else{ for(int i = 0;i8;i++){ if(finish(x+dx[i],y+dy[i])judge(x+dx[i],y+dy[i],m,n)){//若不符合上述条件就表示马放弃之后会走这一步了 board[x+dx[i]][y+dy[i]] = num

文档评论(0)

1亿VIP精品文档

相关文档