C语言。设有下图所示的一个棋盘,在棋盘上的A点,有一个中国象棋的马,并约定马走的规则,从A点跳至B点。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言。设有下图所示的一个棋盘,在棋盘上的A点,有一个中国象棋的马,并约定马走的规则,从A点跳至B点。相关的知识,希望对你有一定的参考价值。

规则:1. 马走日字 2. 马只能向右走。
1)编写一个函数,输入A点的x和y值,按规则跳马至B点。
2)在main函数中通过键盘输入x,y的初值,打印马跳过的轨迹和步数。
3)采用递归的思路设计该函数。提示:参见:迷宫寻路的递归算法求解。

作业题实在难...

#include<stdio.h>

//棋盘尺寸
#define X 4
#define Y 8
//B点坐标
#define BX 0
#define BY 8

int pos[100];
int idx = 0;
int drt[4][2]=2,1,1,2,-1,2,-2,1;

bool expand(int x,int y ) 

int i,xn,yn;

if (x==BX && y==BY)
return true;
if (x<0||y<0||x>X||y>Y)
return false;

for(i=0;i<4;i++)

xn=x+drt[i][0];
yn=y+drt[i][1];
pos[2*idx]=xn;
pos[2*idx+1]=yn;
idx++;
if (expand(xn,yn))
return true;
else
idx--;

return false;


int main( ) 
int x,y,i,j;
int ary[X+1][Y+1];

printf("请输入起始点(x,y)\\n");
scanf("%d,%d",&x,&y);
pos[0]=x;
pos[1]=y;
idx=1;

if(expand(x,y))

for(i=0;i<=X;i++)
for(j=0;j<=Y;j++)
ary[i][j]=0;
for(i=0;i<idx;i++)
ary[pos[2*i]][pos[2*i+1]]=i+1;
for(i=0;i<=X;i++)

for(j=0;j<=Y;j++)
printf("%d ",ary[i][j]);
printf("\\n");

printf("共计%d步\\n",idx);

else

printf("不能从A到达B\\n");

追问

: error C2061: syntax error : identifier 'expand'
: error C2059: syntax error : ';'
: error C2059: syntax error : 'type'
: warning C4013: 'expand' undefined; assuming extern returning int
这个是什么问题0 0

追答

你用的啥编译器呀?可以截图看看不

参考技术A //我刚写的,应该符合要求,前提是B点确定,如果不确定,可以再加个scanf语句,输入结束为止,传给search函数就可以了。
#include <stdio.h>

#define ROW 5
#define COL 9

int chess[ROW][COL] ; //棋盘
int step ; //记录步数

int search(int x1, int y1, int x2, int y2)
//x1和y1分别是当前位置行号和列号
//x2和y2分别是B位置行号和列号

int i, j ;
int success = 0 ;
if(x1 == x2 && y1 == y2) //走通

for(i = 0; i < ROW; i++)

for(j = 0; j < COL; j++)

printf("%d ", chess[i][j]) ;

printf("\n") ;

return 1;

//逆时 针顺序 尝试四种走法
//第一种
if(x1+2<ROW && y1+1<COL)

step++ ; //步数+1
chess[x1+2][y1+1] = step ;
success = search(x1+2, y1+1, x2, y2) ;
if(success) //从这条路可以走通
return 1 ;
step-- ; //没走通,回退
chess[x1+2][y1+1] = 0 ;


//第二种
if(x1+1<ROW && y1+2<COL)

step++ ; //步数+1
chess[x1+1][y1+2] = step ;
success = search(x1+1, y1+2, x2, y2) ;
if(success)
return 1 ;
step-- ; //没走通,回退
chess[x1+1][y1+2] = 0 ;


//第三种
if(x1-1<ROW && y1+2<COL)

step++ ; //步数+1
chess[x1-1][y1+2] = step ;
success = search(x1-1, y1+2, x2, y2) ;
if(success)
return 1 ;
step-- ; //没走通,回退
chess[x1-1][y1+2] = 0 ;


//第四种
if(x1-2<ROW && y1+1<COL)

step++ ; //步数+1
chess[x1-2][y1+1] = step ;
success = search(x1-2, y1+1, x2, y2) ;
if(success)
return 1 ;
step-- ; //没走通 回退
chess[x1-2][y1+1] = 0 ;


return 0 ;

int main()

int i, j ;
int x, y ;

for(i = 0; i < ROW; i++)
for(j = 0; j < COL; j++)
chess[i][j] = 0 ;
step = 1 ;

printf("请输入起始点(x,y)\n") ;
scanf("%d,%d", &x, &y) ;

chess[x][y] = step ;
if(search(x, y, 0, 8))
printf("共计%d步。\n", step) ;
return 0 ;
本回答被提问者采纳

以上是关于C语言。设有下图所示的一个棋盘,在棋盘上的A点,有一个中国象棋的马,并约定马走的规则,从A点跳至B点。的主要内容,如果未能解决你的问题,请参考以下文章

过河卒(Noip2002)

过河卒

例3.6过河卒(Noip2002)

2002过河卒

如图,中国象棋的半个棋盘上有一只“马”,开始下棋时,它位于A点,这只“马”第一步有几种可能的走

C语言初阶《三子棋》