免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 10863 | 回复: 30
打印 上一主题 下一主题

[C] 请教一道C编程题,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-06 20:16 |只看该作者 |倒序浏览
本帖最后由 Yunlish 于 2012-09-07 10:53 编辑

下面这道题来自《C程序设计:现代方法》,自学过程中,这道题想了很久,没有想出来,感觉细节地方太多,千头万绪的,思路很难理清楚。想向大家请教。

大家感兴趣的,就来瞄一瞄哈,说出思路,或者贴下代码即可。先谢过了。


编写程序,生成一种贯穿10*10字符数组(初始时全为字符 ‘.’ )的“随机步法”。程序必须随机地从一个元素“走到”另一个元素,每次都上下、向左或向右移动一个元素位置。已访问过的元素按访问顺序用字母A到Z进行标记。下面是一个输出示例。

A  .  .  .  .  .  .  .  .  .
B C D .  .  .  .  .  .  .
.  F  E .  .  .  .  .  .  .
H G .  .  .  .  .  .  .  .
I  .  .  .  .  .  .  .  .  .
J  .  .  .  .  .  .  .  Z  .
K .  . R S  T U V Y  .
L M P Q .  .  . W X .
.  N O .  .  .  .  .  .  .
.  .  .  .  .  .  .  .  .  .

提示:利用srand函数和rand函数产生随机数,然后查看此数除以4的余数。余数一共有4种可能的值(0,1,2和3),指示下一次移动的4种可能方向。在执行移动之前,需要检查两项内容:1是不能走到数组外面,二是不能走到已有字母标记的位置。只要有一个条件不满足,就得尝试换一个方向移动。如果4个方向都堵住了,程序就必须终止了。下面是提前结束的一个实例:
A B G H I  .  .  .  .  .
.  C  F . J  K  .  .  .  .
.  D E  . M L  .  .  .  .
.  .  .  .  N O  .  .  .  .
.  . W X Y P  Q .  .  .
.  . V  U T S R  .  .  .
.  .  .  .  .  .  .  .  .   .
.  .  .  .  .  .  .  .  .   .
.  .  .  .  .  .  .  .  .   .
.  .  .  .  .  .  .  .  .   .
因为Y的四个方向都堵住了,所以没有地方可以放置下一步的Z了

本人笨得很
鄙视的,板砖轻拍

再一次感谢大家

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2012-09-06 20:21 |只看该作者
响应LZ号召,鄙视之

论坛徽章:
0
3 [报告]
发表于 2012-09-06 20:23 |只看该作者
回复 2# folklore
汗,鄙视可以的啊.....我放在最下面角落里,你还是看到了.....

只是那样的回复太水了,感觉不大好


   

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2012-09-06 20:35 |只看该作者
回复 3# Yunlish


    算法都给你写得这么明白了,
你一步一步将其翻译成代码就可以了啊。

srand的种子,可以让用户输入,或是用time()

此外,我就只会灌水,其它的还没学会啊

论坛徽章:
0
5 [报告]
发表于 2012-09-06 20:41 |只看该作者
哦,谢谢。
因为前一阵子我想过好长时间。
比如循环的终止判断,switch语句怎么写等。代码总是写到中途,就不知怎么进行下去了。
我再仔细想一想吧。
回复 4# folklore


   

论坛徽章:
0
6 [报告]
发表于 2012-09-06 20:42 |只看该作者
我知道你们这群老手,平时就是来论坛灌水找乐子的
倒不是你们本身不会
回复 4# folklore


   

论坛徽章:
0
7 [报告]
发表于 2012-09-06 23:21 |只看该作者
给出大概的实现(这种方法总能找到路径)
先声明一个结构体
struct   point{
       int       x;
       int       y;
}
定义一个函数  ,参数为  char   panel[10][10],二维数组中全置为 '.' 符号
设置一个记录所走路径的数组 struct point  way_pt_a[26];
已经走的步数 int    pt_index;
定义一个临时变量  tp
记录当前所在点的结构   struct point  cur_pos;
设置一个变量 int  flag 记录 移动方向
接下来用随机数产生一个 point 并放在 panel[0][0]中作为起始点

然后while(1)设置一个死循环
接下来是循环体中的内容
先产生一个小于4的随机数放在tp中  tp = rand()%4
然后判断tp的值来决定走向,并将走向保存在 flag中
如果欲到达的那一格也未被占据,则就将保存那一格的位置并更新各变量
否则尝试别的方向,如果三面都被占据,则将当前这一个格设置为‘#’符号,使之处于占据状态
当pt_id == 26的时候跳出循环
函数return


打印出二维数组,遇到‘#’号就打印成 ‘.’号

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
8 [报告]
发表于 2012-09-06 23:26 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
9 [报告]
发表于 2012-09-06 23:30 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
10 [报告]
发表于 2012-09-07 10:35 |只看该作者
题目有点没说清楚,按我的理解写了一下
  1. #define                SIZE                10
  2. #define                BLANK                '.'
  3. char                map[SIZE][SIZE];
  4. int                        x, y;

  5. bool Up()
  6. {
  7.         if (y > 0 && map[y-1][x] == BLANK)
  8.         {
  9.                 --y;
  10.                 return true;
  11.         }

  12.         return false;
  13. }

  14. bool Right()
  15. {
  16.         if (x < SIZE - 1 && map[y][x+1] == BLANK)
  17.         {
  18.                 ++x;
  19.                 return true;
  20.         }

  21.         return false;
  22. }

  23. bool Down()
  24. {
  25.         if (y < SIZE - 1 && map[y+1][x] == BLANK)
  26.         {
  27.                 ++y;
  28.                 return true;
  29.         }

  30.         return false;
  31. }

  32. bool Left()
  33. {
  34.         if (x > 0 && map[y][x-1] == BLANK)
  35.         {
  36.                 --x;
  37.                 return true;
  38.         }

  39.         return false;
  40. }

  41. int main()
  42. {
  43. typedef bool (*LPFN_ACTION)();

  44. LPFN_ACTION                actions[7] = {Up, Right, Down, Left, Up, Right, Down};

  45.         for (y = 0; y < SIZE; ++y)
  46.                 for (x = 0; x < SIZE; ++x)
  47.                         map[y][x] = BLANK;

  48.         x = 0;
  49.         y = 0;
  50.         char c = 'A';
  51.         map[y][x] = c;                       

  52.         srand((unsigned)time(NULL));
  53.         do
  54.         {
  55.                 int v = rand() % 4;

  56.                 if ((*actions[v])() || (*actions[v+1])() || (*actions[v+2])() || (*actions[v+3])())
  57.                 {
  58.                         map[y][x] = ++c;               
  59.                 }
  60.                 else
  61.                 {
  62.                         break;
  63.                 }
  64.         }
  65.         while (c < 'Z');

  66.         for (y = 0; y < SIZE; ++y)
  67.         {
  68.                 for (x = 0; x < SIZE; ++x)
  69.                         putchar(map[y][x]);
  70.                 putchar('\n');
  71.         }

  72.         return 0;
  73. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP