简单的骑士游历

前言:骑士游历是我这个学期的噩梦了吧!可能会有的地方来自寝室人的指导吧~
正文:
Q:对于国际象棋爱好者而言,最有趣的智力题之一就是骑士游历问题。这个问题最早是由数学家欧拉(Euler)提出来的。问题是这样的:被称为骑士(注:类似于中国象棋中的马)的国际象棋棋子是否能够走偏空白棋盘上的64个方格,每个格子只经过一次。现在深入地分析这个有趣的问题。骑士按照一条“L形状”的路线移动(在一个方向上移动两格,然后转一个直角再移动一格)。这样,从空白棋盘中心的一格K出发,骑士就可以有下图所示八种不同的移动方案(方案0到方案7)。现在请开发一个程序来在一个棋盘上移动骑士。棋盘用一个8×8的双下标整型数组board表示,所有的数组元素(表示一个格子)都初始化为0。我们用移动方案中的水平和垂直位移量来表示8种可能的移动方案。例如,上图中的方案0为水平向右移动两格,然后再垂直向上移动一格,2号方案是水平向左移动一格,然后再垂直向上移动两格。水平向左和垂直向上移动用负数表示。这8种方案用如下的两个单下标数组horizontal和vertical表示:horizontal[ 0 ] = 2; vertical[ 0 ] = -1;horizontal[ 1 ] = 1; vertical[ 1 ] = -2;horizontal[ 2 ] = -1; vertical[ 2 ] = -2;horizontal[ 3 ] = -2; vertical[ 3 ] = -1; horizontal[ 4 ] = -2; vertical[ 4 ] = 1;horizontal[ 5 ] = -1; vertical[ 5 ] = 2;horizontal[ 6 ] = 1; vertical[ 6 ] = 2;horizontal[ 7 ] = 2; vertical[ 7 ] = 1;用变量currentRow和currentColumn来表示棋盘中骑士当前位置的行号和列号。移动方案用整型变量moveNumber来表示,moveNumber的取值范围在0到7之间。要求程序使用如下语句:currentRow += vertival[ moveNumber ];currentColumn += horizontal[ moveNumber ];采用一个在1到64之间变化的计数器变量counter来记录骑士是在第几步走到某一个格子中的。切记,在每一次移动之前,先检查即将进行的移动是否走进了一个已经走过的格子或者是否会走出棋盘。运行程序,看看这个骑士能走多少步?
源代码:

#include<stdio.h>
int main(){	
    int board[8][8] = { 0 };	
	int horizontal[8];
	int vertical[8];	
	horizontal[0] = 2;     vertical[0] = -1;	
	horizontal[1] = 1;     vertical[1] = -2;	
	horizontal[2] = -1;    vertical[2] = -2;	
	horizontal[3] = -2;    vertical[3] = -1;	
	horizontal[4] = -2;    vertical[4] = 1;	
	horizontal[5] = -1;    vertical[5] = 2;	
	horizontal[6] = 1;     vertical[6] = 2;	
	horizontal[7] = 2;     vertical[7] = 1;	
	int currentRow, currentColumn;	
	printf("start row is ");	
	scanf("%d", &currentRow);	
	printf("start column is ");	
	scanf("%d", &currentColumn);	
	int counter =0;	
	int flag=1;	
	while (flag==1)	{		
		for (int moveNumber = 0; moveNumber < 8; moveNumber++){		
			int a= currentRow+vertical[moveNumber], b= currentColumn + horizontal[moveNumber];			
			if (a>-1&&a < 8&& -1 < b&&b < 8 && (board[a][b] == 0)){				
			    currentRow += vertical[moveNumber];				
				currentColumn += horizontal[moveNumber];				
				counter++;				
				board[currentRow][currentColumn] = counter;				
				flag = 1;				
				break;			
			}		   
			else{			
			    flag=0;	    	
			}	
		}	
	}	
	for(int i=0;i<8;i++){		
	    for(int j=0;j<8;j++){			
		    printf("%d\t",board[i][j]);		
		}		
		printf("\n");	
	}
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值