这是一个棋牌游戏公司的面试题,也许你也会遇到,看看吧!

/**

*面试题

骑士营救公主

骑士只能向右或者向下移动,遇到陷阱就死了,求骑士营救公主的所有路线,用你熟悉的语言编写程序。

本题由于只能向下和向右,所有他们的路径长度都相同(每个格子长度相等)

解题:寻路, 最短路径,找出所有路径-

*/

如图:

对应二维数组关系如图:

程序源代码:

struct {

int x;//路径X轴坐标

int y;//路径Y轴坐标

int dir;//路径方向

}stack[120],path[120];

void goMG()

{

int row =8;//行数

int col =10;//列数

int maxSize =120;//栈最多元素个数

int mg[10][12]={     //一个迷宫,其四周要加上均为1的外框

{1,1,1,1,1,1,1,1,1,1,1,1},

{1,0,0,0,0,0,0,0,0,1,0,1},

{1,0,0,0,0,1,0,0,0,0,0,1},

{1,0,0,1,0,0,0,0,1,0,0,1},

{1,0,0,0,0,0,0,1,0,0,0,1},

{1,0,0,0,0,0,0,0,0,1,0,1},

{1,0,1,0,0,0,1,0,0,0,0,1},

{1,0,0,0,1,0,0,0,1,0,0,1},

{1,0,1,0,0,0,0,0,0,0,0,1},

{1,1,1,1,1,1,1,1,1,1,1,1}

};

int top = -1;///栈顶指针

int dir = -1;//方向 0向右走,1向下走,只能向右或者向下走

int i ,j,find;

int count =0;//统计找到的路线,路径数计数

int minSize = maxSize;//最短路径长度

mg[1][1] = -1;//初始结点进栈

top++;stack[top].x =1;stack[top].y=1;stack[top].dir=-1;

while (top > -1) {//栈不空时循环

i = stack[top].x; j =stack[top].y; dir =stack[top].dir;

if(i == row && j == col){//找到了出口,输出路径

printf("\n找到了一条路线:%d,长度为:%d \n ", ++count, (top+1));

for(int k =0;k <= top; k++){

printf("(%d,%d) ",stack[k].x,stack[k].y);

if((k+1)%5 ==0){printf("\n");}//输出时每5个结点换一行

}

if((top+1) < minSize){//记录最短路径

minSize = top +1;

for(int min =0; min <= top; min++){

path[min] =stack[min];

}

}

mg[stack[top].x][stack[top].y] = 0;//让该位置变为其他路径的可走结点

//返回上一个节点,继续查找其他的路径

top--;

i = stack[top].x; j =stack[top].y; dir =stack[top].dir;

}

find = 0;

while (dir <2 && find ==0) {

dir++;

switch (dir) {

case0:

i =stack[top].x; j =stack[top].y+1;break;//右边

case1:

i =stack[top].x+1; j =stack[top].y;break;//下边

default:

break;

}

if(mg[i][j] ==0)

find =1;

}

if(find ==1){//找到了下一个可走结点

stack[top].dir = dir;//修改原栈顶元素的dir值

top++;//下一个可走结点进栈

stack[top].x = i;

stack[top].y = j;

stack[top].dir = -1;

mg[i][j] = -1;//把当前走的点赋值,标记为已走过,避免重复走到该结点

}else{

mg[stack[top].x][stack[top].y] = 0;//让该位置变为其他路径的可走结点

top--;//返回之前节点

}

}

printf("\n所有的路径条数为:%d \n",count);

//本题由于只能向下和向右,所有他们的路径长度都相同

printf("最短路径长度为:%d \n",minSize);

printf("最短路径为:\n");

for (int k =0; k < minSize; k++) {

printf("(%d,%d)",path[k].x,path[k].y);

}

printf("\n");

}

部分输出结果:

欢迎下方留言谈论,或者加入QQ群83459374交流!

面试题七 C/C++ 骑士营救公主 骑士只能向右或者向下移动,遇到陷阱就死了,求骑士营救公主的所有路线-程序员面试题相关推荐

  1. 2006上半年程序员级试题答案

    2006上半年程序员级试题答案 上午(每空1分) (1) A (16) C (31) A (46) D (61) C (2) D (17) C (32) C (47) B (62) A (3) D ( ...

  2. php程序员笔试题库,2017年初级PHP程序员笔试题

    2017年初级PHP程序员笔试题 即将面临毕业的准毕业生们是不是在为工作发愁了?下面是百分网小编精心为大家整理的2017年初级PHP程序员笔试题,希望对大家有帮助,更多内容请关注应届毕业生网! 一.基 ...

  3. 程序员笔试题收集汇总(三)

    相关文章: 程序员笔试题收集汇总(一) http://blog.csdn.net/youyou1543724847/article/details/52383530 程序员笔试题收集汇总(二) htt ...

  4. 计算机水平考试 初级,计算机水平考试-初级程序员下午试题模拟38

    计算机水平考试-初级程序员下午试题模拟38 (8页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 初级程序员下午试题模拟38试题一阅读以下说明 ...

  5. 计算机水平考试试题c,计算机水平考试-初级程序员下午试题模拟6

    计算机水平考试-初级程序员下午试题模拟6 (12页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 初级程序员下午试题模拟6试题一阅读以下应用程 ...

  6. php mysql笔试题_初级PHP程序员笔试题

    初级PHP程序员笔试题 答题时间:60 – 90分钟 一.基础及程序题(建议使用你擅长的语言:C/C++.PHP.Java) 1.写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一个维数 ...

  7. java 用程序代码解释继承_关于初级java程序员笔试题

    关于初级java程序员笔试题 Sun 认证Java程序员考试内容涉及Java所有相关知识.编程概念及applet开发技巧.下面是小编整理的关于初级java程序员笔试题,欢迎大家参考! 第一题:判断题 ...

  8. 2008年上半年程序员考试试题分析

    文章试读 不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八的职场感悟吧.不值钱的软件人才 精力充沛与事业成功   让系分来得更猛烈 ...

  9. 程序员面试题精选100题(03)-子数组的最大和[算法]

    题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, ...

  10. 正则表达式笔试题php,2017年初级PHP程序员笔试题

    2017年初级PHP程序员笔试题 6.实现一个字符串截取的函数,类似于substr,必须能够截取中文这种多字节编码.假设每个中文也是一个字符,普通的数字.符号.字母也是一个字 符.(提示:GB编码的中 ...

最新文章

  1. Linux的scp命令
  2. uva 11978 Fukushima Nuclear Blast (二分+多边形与圆交)
  3. oracle:导入数据,遇到oracle错误 959
  4. 简单谈谈linux的文件权限问题
  5. 前端学习(1346):用户的增删改查操作3增加
  6. 文件加密保卫中小企业信息安全
  7. Git生成ssh密钥指定文件
  8. ListDictionary:改进的OrderedDictionary
  9. urllib2 request 模拟伪装浏览器
  10. fl2440hello world模块驱动编写
  11. 对HDLC 和PPP实验的总结
  12. mysql数据库——思维导图
  13. 修改注册表让PPC手机更加省电方法
  14. MOS管的源极和漏极的区别
  15. 怎么把度分秒化成小数_excel中批量将经纬度度分秒转换成十进制小数点的方法介绍...
  16. python生成Excel透视表
  17. Succinimidyl Carboxymethyl Ester-PEG-Mal,Mal-poly(ethylene glycol)-SCM
  18. If today were the last day of my life
  19. 海康威视主码流和子码流的区别
  20. Database Mirroring

热门文章

  1. java 计算父亲节_java实现计算周期性提醒的示例
  2. Navicat注释乱码
  3. 2011 年11 月系统集成项目管理工程师上午考试(刘俊平老师)
  4. Java实现 蓝桥杯 算法提高 日期计算
  5. TypeError: can‘t convert cuda:0 device type tensor to numpy. Use Tensor.cpu()
  6. JAVA-基础之如何区分汉字和英文
  7. android 扫描wifi列表重复,Android Settings 出现重复的WIFI SSID,多个相同的WIFI SSID
  8. 我的python学习(前言 初生牛犊不怕虎)
  9. 云服务器入门篇:搭建云服务器Java web环境(Ubuntu Server 16.04.1 LTS 64位)
  10. 什么是 IP 冲突以及如何解决?