无名侠 发表于 2015-7-27 21:59:09

【编程之美】 中国象棋将帅问题

{:9_240:} 先给学算法的童鞋介绍一本书《编程之美》。 很有意思!! 第一章是讲如何玩CPU,呵呵好玩把?

先来看上面的一道题:
http://hi.csdn.net/attachment/201103/25/0_1301039009yFvf.gif

注意题目要求只能使用一个变量! 好坑爹的说~~~~~~

这个问题实际上就是找两个量在3X3的矩阵上不再同一列,也就是 x%3!=y%3
看代码:
void easy(){
        for(int i=1;i<=9;i++)
                for(int j=1;j<=9;j++)
                        if(i%3 != j%3)
                                printf("A=%d,B=%d\n",i,j);       
}

但是题目要求的是只能使用1个变量。那该怎么做呢?上面用到了两个char,两个char就是short int类型。 short int可以算是一个变量,然后用指针转换为char数组,记住不能使用使用第二个变量中转,所以要写很多转换代码。
#define pChar(x)((char *)&x)
void fun3()
{
        // 利用指针来操作同一个变量
        short int i2;
        for(*pChar(i2)=1;*pChar(i2)<=9;*pChar(i2)+=1)
                for(pChar(i2)=1;pChar(i2)<=9;pChar(i2)++)
                        if(pChar(i2)%3 != pChar(i2)%3)
                                printf("A=%d,B=%d\n",pChar(i2),pChar(i2));
}

这个是书上的一段代码:

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;
i=81 实际上是把两次循环变为了一次循环,很有意思把。

这里还有一种方法,用到了结构体。
struct{
        unsigned char a:4;
        unsigned char b:4;
}i;
void fun2()
{
        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);
}

一个简单的问题就延伸出了这么多写法,你有什么更好的写法吗?

小甲鱼 发表于 2015-8-6 21:36:48

感谢无名侠分享,学到了~

zhang99844 发表于 2015-9-5 08:58:31


好东西 谢谢分享
页: [1]
查看完整版本: 【编程之美】 中国象棋将帅问题