整数变换和九重宫问题.docVIP

  • 2
  • 0
  • 约2.21千字
  • 约 4页
  • 2018-02-20 发布于河南
  • 举报
整数变换和九重宫问题

整数变换和九重宫问题 一.目的和要求 (1)熟悉C语言的开发环境; (2)进一步熟悉递归的正确使用; (3)加强对相关算法的分析能力; (4)增强算法的设计能力; 二.课题内容 (1)整数变换; (2)九重宫问题; 三.算法设计 (1)整数变换; 步骤一:穷举第一种变换 步骤二:穷举第二种变换 步骤三:中间有不合法的进行剪枝 (2)九重宫问题; 步骤一:分别穷举上下左右四种变换 步骤三:中间有不合法的进行剪枝 步骤三:直到完成即可,输出得到结果的过程 四.重要代码 (1)整数变换; void fun(int s,int k) //k记录递归深度 { //是否有解 if(k MaxDept) { return; } if(s == d) { dept = k; output(); ok = 1; return; } if(ok == 1) return; t[k] = f; fun(s/2,k+1); if(ok == 1) return; t[k] = g; fun(s*3,k+1); } (2)九重宫问题; //path 记录 最短的那条路径 //move 记录 中间走过的路径 //ok 记录是否成功了 //count 运算的次数 //MinCount 目前能到达目标的最少次数 void PuzzleRec(int a[], int n, int count, int MinCount, int move[], int path[], int ok) { int IsOk(int a[], int m); if ( IsOk(a, n*n) ) { if (countMinCount) { MinCount = count; for (int i=0; iMinCount; i++) path[i] = move[i]; } ok = 1; return; } if (count=MinCount) return; int i = 0; while (a[i] != 0) i++; //上下左右,但是又不能与上次的重复了,直接还原没有意义 if ((i=n)( (0==count)||(move[count-1]!=n) )) { swapint(a[i], a[i-n]); move[count] = -n; PuzzleRec(a, n, count+1, MinCount, move, path, ok); swapint(a[i], a[i-n]); } if ((in*n-n)( (0==count)||(move[count-1]!=-n) )) { swapint(a[i], a[i+n]); move[count] = n; PuzzleRec(a, n, count+1, MinCount, move, path, ok); swapint(a[i], a[i+n]); } if ((i%n0)( (0==count)||(move[count-1]!=1) )) { swapint(a[i], a[i-1]); move[count] = -1; PuzzleRec(a, n, count+1, MinCount, move, path, ok); swapint(a[i], a[i-1]); } if ((i%nn-1)( (0==count)||(move[count-1]!=-1) )) { swapint(a[i], a[i+1]); move[count] = 1; PuzzleRec(a, n, count+1, MinCount, move, path, ok); swapint(a[i], a[i+1]); } } //判断一个状态是不是已经还原了 int IsOk(int a[], int m) { for (int i=0; im-1; i++) if (a[i]!= i+1) return 0; return 1

文档评论(0)

1亿VIP精品文档

相关文档