| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4365 人关注过本帖
标题:马踏棋盘
取消只看楼主 加入收藏
fantasy_wuhan
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-6-21
收藏
 问题点数:0 回复次数:7 
马踏棋盘
数据结构课程设计  题目

在8×8的棋盘写非递归程序

输出行走路线 用堆栈结构实现非递归的马踏棋盘的算法,
搜索更多相关主题的帖子: 堆栈 棋盘 递归 课程 数据结构 
2005-06-21 15:42
fantasy_wuhan
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-6-21
收藏
得分:0 
我正在做这个 都弄了一个下午  快做完了

但是就是怕不符合要求   有一个地方可以用栈来实现的

思路1:
首先选择一个一个点 再将该点周围的8 个点(按行走规则)入栈 再出栈 找到合适的点(在棋盘上 且没有走过)作为下一个行走点  依此进行

我想  思路1是不是不够严谨  如果遇到一个点周围的8 个点都不可行(不在棋盘或已经走过了)的话 那怎么办 难道还要建一个栈 每操作一次就对行走的点入栈?所以在思路2中加了进一段代码 防止以外 但是这段代码我不是用栈来实现 的
就是很普通的那种

最后我想 要不要信建一种结构体 对应棋盘的每个空格 那不是有64个结构体了?再建一个栈来。。。 (这我自己乱想的
反正乱 想到这里思路就很乱了 自己第一次编一个比以前大的程序 呵呵 )
2005-06-21 16:51
fantasy_wuhan
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-6-21
收藏
得分:0 
谁可以把源代码 上传 给我看一下啊
2005-06-21 18:11
fantasy_wuhan
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-6-21
收藏
得分:0 
谁来帮我 啊  
2005-06-21 20:09
fantasy_wuhan
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-6-21
收藏
得分:0 
楼上的  请问 怎样才算符合 比如 :a周围有b1--b8 八个方向 从a探索 符合要求就入栈
请问 入栈的是a 还是b1--b8中的的一个
 
可不可以详细一些
2005-06-21 22:15
fantasy_wuhan
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-6-21
收藏
得分:0 
首先选择一个一个点a 再将该点周围的8 个点(按行走规则)入栈 再依次出栈 找到合适的点(在棋盘上 且没有走过)作为下一个行走点b  依此进行再将b周围的八个点入栈  

这样可不可以  是不是有些疏漏  我运行结果 不对 就是找不出

楼上的qq可不可以留下  有机会聊 聊  
2005-06-22 01:41
fantasy_wuhan
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-6-21
收藏
得分:0 

我的代码 可是结果有问题 找不出来 #define NULL 0 #define N 8

typedef struct Elemtype{ int row; int col; }Elemtype; /*栈元素*/

typedef struct Nodetype{ Elemtype data; struct Nodetype *next; }Nodetype,*Linktype; /*结点类型*/

typedef struct Stack{ Linktype top; int size; }Stack; /*栈类型*/

void push(Elemtype value,Stack S) { Linktype newnode;

newnode=(Linktype)malloc(sizeof(Nodetype));

newnode->data=value;

newnode->next=S.top;

S.top=newnode;

S.size++;

}/*存入数据*/

Elemtype pop(Stack S) { Elemtype temp; Linktype s;

if(S.top->next) { s=S.top; S.top=s->next; temp=s->data; free(s); S.size--; return temp; }

} /*取出数据*/

CreateStack(Stack S) {

S.top=(Linktype)malloc(sizeof(Nodetype));

S.top->next=NULL;

S.size=0;

} /*创建栈*/

int jump(int i,int j,int a[N][N]) {

if(i<N&&i>=0&&j<N&&j>=0&&a[i][j]==0) return 1; else return 0; } /*判断可行点*/

void output(int a[N][N]) { int i,j; for(i=0;i<N;i++) { for(j=0;j<N;j++) { printf("%3d",a[i][j]); printf("\n"); } }

printf("\n");

} /*输出路径*/

void Delet(Stack S) { while(S.top) { Linktype temp; temp=S.top; S.top=temp->next; free(temp); } } /*输出路径*/

Stack S; Elemtype elem1, elem2,elem3;

main() { int HTry1[8]={-2,-1,1,2,2,1,-1,-2}; int HTry2[8]={1,2,2,1,-1,-2,-2,-1};

int board[N][N]={0};

int k,i,j,ti,tj,p=1,num=0;

printf("输入i,j的值:"); scanf("%d%d",&i,&j);

CreateStack(S);

elem1.row = i;

elem1.col = j;

push(elem1,S);

num++;

board[i][j] = num;

while( num>0 && num < 64) { for(k=0;k<8;k++) { i=i+HTry1[k]; j=j+HTry2[k];

if(jump(i,j,board[i][j])==1)

break;

} /*在点(i,j)周围8个点中寻找可扩展点*/

if(p==0) board[ti][tj]=0;

if(k<8) { elem2.row=i; elem2.col=j; push(elem2,S); num ++; board[i][j] = num; p=1; } /*在(i,j)周围八个点中找到的合适的入栈*/ else { elem2 = pop(S); ti=elem2.row; tj=elem2.col; p=0;

elem3=pop(S);

i=elem3.row; j=elem3.col; } /*8个点都不合适*/

}

output(board);

}

2005-06-22 12:49
fantasy_wuhan
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-6-21
收藏
得分:0 
shi a
2005-06-22 13:33
快速回复:马踏棋盘
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.075912 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved