因为刚学完数组,不知道后面的知识,但是书后的练习题有这样的题目,写了一个程序,感觉又繁琐又难看,而且我也不大会注解,毛病有不少,但自己又找不出来,所以请高手指点我的不足的地方,比如算法,注释,命名等。而且程序运行后无法遍历。所以非常诚恳的请教高手,请不吝指点迷津,小弟万分感谢
谢谢!
题目:8*8的棋盘上,象棋中的马能否走完64个方格,每个方格只能走一次。
#include<stdio.h>
int bestchoice(int a[],int n);
main()
{
int board[8][8]={1,0}, //棋盘,从board[0][0]开始走
moveRow[8]={2,1,-1,-2,-2,-1,1,2}, //存放横向坐标
moveColumn[8]={-1,-2,-2,-1,1,2,2,1}, // 存放纵向坐标
visitLevel[8][8]={2,3,4,4,4,4,3,2,3,4,6,6,6,6,4,3, //访问等级,对应棋盘坐标
4,6,8,8,8,8,6,4,4,6,8,8,8,8,6,4,4,6,8,8,8,8,6,4,4,6,8,
8,8,8,6,4,3,4,6,6,6,6,4,3,2,3,4,4,4,4,3,2},
a[8]; //存放访问等级的数据
int row,column,row1,column1,condition,count;
int moveNumber; //走法 取值0--7,共8种
row=0;
row1=0; //纪录row上次的值
column=0;
column1=0; //纪录column上次的值
condition=1;
while(condition>0) //condition判断马是否能继续走动,等于0意味着走不动
{
for(count=0;count<8;count++) //初始化a[8],令其元素都等于零,以便存入数据
a[count]=0;
condition=0; //初始化,控制循环
for(moveNumber=0;moveNumber<8;moveNumber++) //将各种"走法"的访问等级存入a[8]
{
row+=moveRow[moveNumber];
column+=moveColumn[moveNumber];
if(row>=0&&row<=7&&column>=0&&column<=7&&board[row][column]==0) //判断走法是否越界
{
condition++;
a[moveNumber]=visitLevel[row][column];
}
row=row1;
column=column1;
} //结束for循环
if(condition>0){
moveNumber=bestchoice(a,8); //选择最佳的走法
row+=moveRow[ moveNumber ];
column+=moveColumn[ moveNumber ]; //移动
row1=row;
column1=column;
board[row][column]=1; //能到达的方格标记为1
}
}
printf("\n1代表可以到达,0代表不能到达:\n");
int i,j;
for(i=0;i<8;i++) {
for(j=0;j<8;j++)
printf("%3d",board[i][j]);
printf("\n");
}
return 0;
}
int bestchoice(int a[],int n) //选择最小的访问等级,返回下标,即为moveNumber
{
int min=9;
int i;
for(i=0;i<n;i++)
{
if(a[i]!=0&&a[i]<min)
min=a[i];
}
for(i=0;i<n;i++)
{
if(min==a[i])
return i;
}
}