| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 590 人关注过本帖
标题:马踏棋盘问题
只看楼主 加入收藏
营养书
Rank: 2
等 级:论坛游民
帖 子:25
专家分:29
注 册:2011-4-17
结帖率:100%
收藏
已结贴  问题点数:15 回复次数:6 
马踏棋盘问题
只能执行到第二步,找不出结果,求各位帮忙

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>


#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef struct Point{
 
 int x;
 int y;
 int e;
}Point;

typedef struct {
  Point *base;
  Point *top;
  int stacksize;
 }SqStack;

int InitStack(SqStack *S)
{
 (*S).base =(Point *)malloc(STACK_INIT_SIZE*sizeof(Point));
 if(!(*S).base)exit(1);
 (*S).top = (*S).base;
 (*S).stacksize = STACK_INIT_SIZE;
 return 1;
}

int StackEmpty(SqStack *S)
{
    if((*S).top==(*S).base)
        return 1;
    else
        return 0;
}
int Push(SqStack *S,Point e)
{

 if((*S).top - (*S).base >= (*S).stacksize)
 {
  (*S).base =(Point *)realloc((*S).base,((*S).stacksize+STACKINCREMENT) * sizeof(Point));
  if(!(*S).base)exit(1);
  (*S).top = (*S).base+(*S).stacksize;
  (*S).stacksize += STACKINCREMENT;
 }
 *(*S).top++ = e;
 return 1;
}

int Pop(SqStack *S, Point *e)
{
 if((*S).top ==(*S).base) return 0;
 *e = * --(*S).top;
 return 1;
}

int SetTop(SqStack S,Point *e)
{
    if(S.top>S.base)
    {
        *(S.top-1)=*e;
        return 1;
    }
    else
        return 0;
}

void main()
{
 Point e;
 int count=1;
 int i,j;
 int board[8][8]={{0}};
 int x1,y1;
 int move1[8]={2,2,1,1,-1,-1,-2,-2,},  
      move2[8]={1,-1,2,-2,2,-2,1,-1,};  
 int pic[8][8]; //对应棋盘

 SqStack S;
 
 for(i=0;i<8;i++)
  for(j=0;j<8;j++)
   pic[i][j]=0;

//输入入口点,并让其进栈

 printf("输入x1(0-7),y1(0-7):");
 scanf("%d%d",&x1,&y1);
 
 e.x=x1;
 e.y=y1;
 pic[x1][y1]=1;
 InitStack(&S);
 Push(&S,e);
 int k=0;
 while(count!=64)
 {
   if(x1+move1[k]>0&&x1+move1[k]<=8&&y1+move2[k]>0&&y1+move2[k]<=8&&board[x1+move1[k]][y1+move2[k]]==0)
     {     
         
           pic[x1+move1[k]][y1+move2[k]]=++count;
           
           e.x=x1+move1[k];
           e.y=y1+move2[k];
           Push(&S,e);
           k=0;
     }
   else
       board[x1+move1[k]][y1+move2[k]]=1;
       k++;
 }

 while(!StackEmpty(&S))
     {
      Pop(&S,&e);
      printf("(%d %d)",e.x,e.y);
     }
     printf("\n");
   /* 打印出马走棋盘的路线*/
 for(i=0;i<8;i++)
   {
     for(j=0;j<8;j++)
       printf("%d\t",pic[i][j]);
        printf("\n\n\n");
   }

}
搜索更多相关主题的帖子: return 
2011-05-03 15:36
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:5 
能不能解释下是怎么回事  
2011-05-03 16:36
营养书
Rank: 2
等 级:论坛游民
帖 子:25
专家分:29
注 册:2011-4-17
收藏
得分:0 
将马随即放在国际象棋的8×8棋盘Board[8][8]的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,……,64依次填入一个8×8的方阵,输出之。
2011-05-03 17:08
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:5 
这个一般就是回溯算法呀。用循环就可以不递归。
只不过回溯的量大的要命。解一个题花个半分钟,一分钟之类的很有可能。
2011-05-05 16:41
营养书
Rank: 2
等 级:论坛游民
帖 子:25
专家分:29
注 册:2011-4-17
收藏
得分:0 
要求用栈的。。。
2011-05-05 21:09
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
    int move1[8]={2,2,1,1,-1,-1,-2,-2,}, 
        move2[8]={1,-1,2,-2,2,-2,1,-1,};  
这句中move1 和 move2 分别表示什么?
2011-05-07 19:48
独立观察员
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2012-10-25
收藏
得分:0 
回复 6楼 寒风中的细雨
代表马下一步的坐标偏移量
2012-10-25 21:50
快速回复:马踏棋盘问题
数据加载中...
 
   



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

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