马踏棋盘程序解释

此程序为百度知道里面一个兄弟回答过的十分经典但是因为本人实力有限很多都看不懂所以请求懂得高手帮忙给我解释解释最好是能把算法思想、重要的模块和语句都解释一下不胜感激····... 此程序为百度知道里面一个兄弟回答过的 十分经典 但是因为本人实力有限 很多都看不懂 所以请求懂得高手帮忙给我解释解释 最好是能把算法思想、重要的模块和语句都解释一下 不胜感激····

#include <stdio.h>
main()
{
int a[9][9],object[9][9],step[9][3]={{0,0,0},{1,1,2},{2,1,-2},{3,-1,2},{4,-1,-2},
{5,2,1},{6,2,-1},{7,-2,1},{8,-2,-1}};
int i,j,k,x,y,z,m,n,min;
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
a[i][j]=0; /* clear data in array */
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
for(k=1;k<=8;k++)
{
x=i;y=j;
x=x+step[k][1];
y=y+step[k][2];
if(x>=1&&x<=8&&y>=1&&y<=8)
a[i][j]++ ; /* initilize array */
} /* start col and row;*/
printf("Please inpute start position x,y\n");
scanf("%d,%d",&m,&n);
for(z=1;z<=64;z++)
{
min =10;
object[m][n]=z;
a[m][n]=0;
for(k=1;k<=8;k++)
{
x=m+step[k][1];
y=n+step[k][2];
if(x>=1&&x<=8&&y>=1&&y<=8)
if(a[x][y]!=0)
{
--a[x][y];
if(a[x][y]<min)
{
min=a[x][y];
i=x;
j=y;
}
}
}
m=i;n=j;
}
for(i=1;i<=8;i++)
{
for(j=1;j<=8;j++)
printf("%6d",object[i][j]);
printf("\n");
}
getch();
}
展开
 我来答
百度网友d6edb0206
推荐于2016-04-27 · TA获得超过100个赞
知道答主
回答量:28
采纳率:0%
帮助的人:0
展开全部
实现马走完8×8棋盘的路线;
分步解析:
(1)
step[9][3]={{0,0,0},{1,1,2},{2,1,-2},{3,-1,2},{4,-1,-2},
{5,2,1},{6,2,-1},{7,-2,1},{8,-2,-1}};设定马可走的八个方向,第二维第一个是序号(没什么用),后两个分别得X坐标,Y坐标增量;
(2)
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
for(k=1;k<=8;k++)
{
x=i;y=j;
x=x+step[k][1];
y=y+step[k][2];
if(x>=1&&x<=8&&y>=1&&y<=8)
a[i][j]++ ; /* initilize array */
}
初始化整个棋盘,a[i][j]表示马在(i,j)上可走的方向个数;例如a[1][1]=2,说明马如果在(1,1)只能走(2,3)和(3,2);这步为后面做铺垫;
(3)
for(z=1;z<=64;z++)
//标记棋盘的64个可达点,起点为1号,终点为64号,object[m][n]=z;

a[m][n]=0;//每走过一个点,就置该点为0,表示不能再走,(if(a[x][y]!=0) );
能走的话(a[i][j])!=0)就选一个小于min的点if(a[x][y]<min) 作为下一步棋; 之所以要选一个a[i][j]最小的点牵扯到一些算法,只有这样才能保证走遍所有点并且不重复。
最后打印,不用说了吧。
大概我想说的就这些。
创作者4XTCONjN3a
2019-02-05 · TA获得超过3802个赞
知道大有可为答主
回答量:3196
采纳率:28%
帮助的人:169万
展开全部
实现马走完8×8棋盘的路线;
分步解析:
(1)
step[9][3]={{0,0,0},{1,1,2},{2,1,-2},{3,-1,2},{4,-1,-2},
{5,2,1},{6,2,-1},{7,-2,1},{8,-2,-1}};设定马可走的八个方向,第二维第一个是序号(没什么用),后两个分别得X坐标,Y坐标增量;
(2)
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
for(k=1;k<=8;k++)
{
x=i;y=j;
x=x+step[k][1];
y=y+step[k][2];
if(x>=1&&x<=8&&y>=1&&y<=8)
a[i][j]++
;
/*
initilize
array
*/
}
初始化整个棋盘,a[i][j]表示马在(i,j)上可走的方向个数;例如a[1][1]=2,说明马如果在(1,1)只能走(2,3)和(3,2);这步为后面做铺垫;
(3)
for(z=1;z<=64;z++)
//标记棋盘的64个可达点,起点为1号,终点为64号,object[m][n]=z;
a[m][n]=0;//每走过一个点,就置该点为0,表示不能再走,(if(a[x][y]!=0)
);
能走的话(a[i][j])!=0)就选一个小于min的点if(a[x][y]<min)
作为下一步棋;
之所以要选一个a[i][j]最小的点牵扯到一些算法,只有这样才能保证走遍所有点并且不重复。
最后打印,不用说了吧。
大概我想说的就这些。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式