工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1643|回复: 6

[算法]穷举寻径。。。

[复制链接]
发表于 2006-10-21 19:01 | 显示全部楼层 |阅读模式
中国象棋棋盘上,从指定的起始位置,到达指定的位置,马有哪几条路径。

初略写了算法描述,就去听单片机讲座了,想想那个算法有考虑不周的地方。。。


试卷上说的好像是从左上角到右下角 的一个特例,
上面的题目是刚在研发中心的论坛上发现的

[ 本帖最后由 iptton 于 2006-10-21 21:50 编辑 ]
 楼主| 发表于 2006-10-21 19:35 | 显示全部楼层
核心算法没写上,先帖了。。。

  1. #include <stdio.h>
  2. typedef struct point{
  3.   int x;
  4.   int y;
  5.   int flag;
  6. }T_chess[9][10];
  7. struct pointStack{
  8.   struct point * value;
  9.   struct pointStack *next;
  10. }

  11. T_chess chess;


  12. void findDir(struct point*,struct point*);
  13. void printDir(struct point*);
  14. struct pointStack * allocStack(struct point* value);

  15. int main(){
  16.   struct point start,end;

  17.   //initial data
  18.   for(i=0;i<9;i++){
  19.     for(j=0;j<10;j++){
  20.       chess[i][j].x=i;
  21.       chess[i][j].y=j;
  22.       chess[i][j].flag=0;
  23.     }
  24.   }

  25.   scanf("%d %d %d %d",&start.x,&start.y,&end.x,&end.y);
  26.   start.flag=1;
  27.   end.flag=0;

  28.   findDir(&start,&end);
  29. }

  30. void findDir(struct point *s,struct point *e)
  31. {


  32. }
  33. void printDir(struct pointStack *s)
  34. {
  35.   struct pointStack *tmp;
  36.   while(!s){
  37.     printf("[%d,%d]  ",(s->value).x,(s->value).y);
  38.     tmp=s->next;
  39.     s=tmp;
  40.   }

  41. }
  42. struct pointStack * allocStack(struct point * value){
  43.   struct pointStack *ret=malloc(sizof(struct pointStack));
  44.   ret->next=null;
  45.   ret->value=s;
  46.   return ret;
  47. }
复制代码

[ 本帖最后由 iptton 于 2006-10-21 19:47 编辑 ]
回复

使用道具 举报

发表于 2006-10-22 10:39 | 显示全部楼层
lz能不能简单介绍一下这个算法啊,我看到这道题是,根本不知从什么方向着手...
回复

使用道具 举报

 楼主| 发表于 2006-10-22 11:46 | 显示全部楼层
楼上可以去找找 寻径算法 
搜索这两个关键词:
 深度优先  回溯


算法的计算机实现是要依赖相应的数据结构的,

不过学C语言时已学过链表了,所以这道题应该只是考算法设计

说说我的思路:
  
         每走一步之前,
   
   1 
    找到下一步可以走的所有的位置,
    标记之(如图中点红色,本来应该各个点的“红”色都不同才对的。。。),
     
    选择上面标记 红 了的步中一步
    标记此步为已经走过了(如图中的黑色),以免在同两步上死循环

   2
          。。。。。。(有空再写)
    

   





   
   计算机对每一个点(棋位)的信息存储应当包括:X,Y座标,当前路径是否已走过这一步的标记(flag),如果这一步走完了,以这一步为起点可走的(即FLAG为false的)点的位置组(为节省空间,可用链表),所以一个点的数据结构应该为:

  1. typedef struct point{
  2.       int x;          //     [0,9)
  3.       int y;                   //     [0,10)
  4.       int flag;                //0 OR 1
  5.       struct point*next;
  6. }T_point[9][10];       //因为中国象棋只有 10*9                     
复制代码

为保存以走的路径信息,又需要一个组有顺序,按先进后出规则操作的的空间(一般称这个为栈):

  1. struct curPath{
  2.     struct point *pointInPath;    //为节省空间,用指针,初始化时要记得用NULL
  3.     struct curPath* next;           //
  4. }
复制代码

[ 本帖最后由 iptton 于 2006-10-22 12:42 编辑 ]

一次寻径示例

一次寻径示例
回复

使用道具 举报

 楼主| 发表于 2006-10-22 12:57 | 显示全部楼层
很明显,第二次回溯后的线路是不能到达目的点的(这个因应该是这个问题的解的优化之处)
chessFindDir2.JPG
chessFindDir3.JPG
回复

使用道具 举报

发表于 2006-10-22 21:40 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2006-10-22 22:17 | 显示全部楼层
这道题只是一道很简单的算法题。。。

离AI还远着呢。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-15 06:56

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表