递归-小游戏(算法基础 第3周)
2016-06-06 00:11
225 查看
问题讲解:
源码:
源码:
#include <stdio.h> #include <memory.h> #define MAXIN 75 char board[MAXIN+2][MAXIN+2]; //定义矩形板 int minstep, w, h, to[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; //定义方向 bool mark[MAXIN+2][MAXIN+2]; //定义标记数组 void Search(int now_x, int now_y, int end_x, int end_y, int step, int f) { if (step > minstep) { return ; //当前路径数大于minstep, 返回->优化策略 } if (now_x==end_x && now_y==end_y) { //到达终点 if (minstep > step) { //更新最小路径数 minstep=step; } return ; } for (int i=0; i<4; i++) { //枚举下一步的方向 int x = now_x+to[i][0]; int y = now_y+to[i][1]; if ( (x>-1)&&(x<w+2)&&(y>-1)&&(y<h+2) && ( ((board[y][x]==' ')&&(mark[y][x]==false)) || ((x==end_x)&&(y==end_y)&&(board[y][x]=='X')) ) ) { mark[y][x]=true; //如果新位置,有效标记该位置 //上一步方向与当前方向相同,则递归搜索时step不变,否则step+1 if (f==i) { Search(x, y, end_x, end_y, step, i); } else { Search(x, y, end_x, end_y, step+1, i); } mark[y][x]=false; //回溯,该位置未曾走过 } } } int main() { int Boardnum=0; while(scanf("%d %d", &w, &h)) { //读入数据 if (w==0 && h==0) { break; } Boardnum++; printf("Board #%d:\n", Boardnum); int i, j; for(i=0; i<MAXIN+2; i++) board[0][i] = board[i][0] = ' '; for(i=1; i<=h; i++) { //读入矩阵版的布局 getchar(); //getchar()不跳过任何字符 for(j=1; j<=w; j++) board[i][j]=getchar(); } //在矩形板最外层增加一圈格子 for(i=0; i<=w; i++) board[h+1][i+1]=' '; for(i=0; i<=h; i++) board[i+1][w+1]=' '; int begin_x, begin_y, end_x, end_y, count=0; while(scanf("%d %d %d %d", &begin_x, &begin_y, &end_x, &end_y) && begin_x>0) { //读入起点和终点 count++; minstep = 10000; //初始化minstep为一个很大的值 memset(mark, false, sizeof(mark)); //递归搜索 Search(begin_x, begin_y, end_x, end_y, 0, -1); //输出结果 if (minstep < 10000) printf("Pair %d: %d segments.\n", count, minstep); else printf("Pair %d: impossible.\n", count); } printf("\n"); } return 0; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例