zoj1091 Knight Moves

/*******************************************
总体思路是计算出起始位置到所有位置的最小步数(用二维数组r来储存)
假如目的位置为e4,那么直接输出r[4][3]即可
*******************************************/
#include
   
   
    
    
#include
    
    
     
     
#include
     
     
      
      

int r[8][8];//存放从起始位置到目的位置的最小步数
int x[] = {2, 1, -1, -2, -2, -1, 1, 2};//x和y数组用来存储搜索的八个方向
int y[] = {1, 2, 2, 1, -1, -2, -2, -1};

void dfs(int a, int b, int c)
{
	int i;
	if(a > 7 || a < 0 || b > 7 || b < 0 || c >= r[a][b])//等号去了则TLE
	{
		return;//a和b表示r数组下标,假如超过范围,则表示不在棋盘
	}	       //c表示步数,假如该位置已搜索过且当前步数大于等于历史值
		       //则这个方向没有必要搜索,假如该位置没被搜索过,为了不错误返回
		       //则要在每次输入时对r数组初始化一个很大的值,详见memset语句
	r[a][b] = c;
	for(i = 0; i < 8; i++)
	{
		dfs(a + x[i], b + y[i], c + 1);
	}
}

int main(void)
{
	char s1[11], s2[11];
	while(scanf("%s%s", s1, s2) != EOF)
	{
		                        //注意r数组中每个值不是1,而是16843009(十进制)
		memset(r, 1, sizeof(r));//因为memset函数是按字节赋值,即00000001000000010000000100000001(二进制)
		dfs(s1[0] - 'a', s1[1] - '1', 0);
		printf("To get from %s to %s takes %d knight moves.\n", s1, s2, r[s2[0] - 'a'][s2[1] - '1']);
	}
	//system("pause");
}

     
     
    
    
   
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值