关于中国象棋的一道微软面试题目

最近看了一道微软的面试题题目是这样的:

    下过中国象棋的朋友都知道,双方的“将”和“帅”相隔遥远,并且他们不能照面。在象棋残局中,许多高手能利用这一规则走出精妙的杀招。假设棋盘上只有将和帅,如下图所示

(为了描述方便,约定A表示将,B表示帅)

A和B二子被限制在己方3X3的个子里运动,例如,在如上的表格里,A被正方形{d10,f10,d8,f8 }包围,而B被正方形{d3,f3,d1,f1}包围

每一步,A,B分别可以横向或纵向移动一格,但不能沿对角线移动,另外,A不能面对B,也就是说,A和B不能处于同一纵向直线上

请些出一个程序,输出A,B所有合法位置,要求代码中只能使用一个变量。

在看参考答案之前我是这么思考的

  将位置(1,4,7)(2,5,8)(3,6,9)分成三组其中第一组用三除余1,第二组余2,第三组整除(余0);

               

#include "stdio.h"
int main()
{   
	for(int i=1;i<10;i++)     
	{ if(i%3==1)         
	  printf("%d,(%d,%d,%d,%d,%d,%d)\n",i,i%3+1,i%3+2,i%3+4,i%3+5,i%3+7,i%3+8);
	  if(i%3==2)
	  printf("%d,(%d,%d,%d,%d,%d,%d)\n",i,i%3-1,i%3+1,i%3+2,i%3+4,i%3+5,i%3+7);
	  if(i%3==0)
	  printf("%d,(%d,%d,%d,%d,%d,%d)\n",i,i%3+1,i%3+2,i%3+4,i%3+5,i%3+7,i%3+8);

    }
	return 0;
}

   虽然满足了要求,但是总感觉是在按图索骥,依照答案找算法,技术含量不怎么高,且效率高低有待商榷。

   《编程之美》作者给出几种答案如下

#include "stdio.h"
int main()
{   
 char i=81;
 while(i--)
 {
	 if(i/9%3==i%9%3)
		 continue;
	 printf("A= %d,B=%d\n",i/9+1,i%9+1);
 }
	return 0;
}


***************************************************************
struct 

{

   unsigned char  a:4;

   unsigned char b:4;

}i;

main()

{

    for(i.a=1;i.a<=9;i.a++)

    for(i.b=1;i.b<=9;i.b++)

     if(i.a%3!=i.b%3)

      printf("A=%d,B=%d\n",i.a,i.b);

}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值