鱼C论坛

 找回密码
 立即注册
查看: 3197|回复: 2

[技术交流] 【编程之美】 中国象棋将帅问题

[复制链接]
发表于 2015-7-27 21:59:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

先来看上面的一道题:

                               
登录/注册后可看大图


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

这个问题实际上就是找两个量在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]=1;pChar(i2)[1]<=9;pChar(i2)[1]++)
                        if(pChar(i2)[0]%3 != pChar(i2)[1]%3)
                                printf("A=%d,B=%d\n",pChar(i2)[0],pChar(i2)[1]);
} 

这个是书上的一段代码:
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);
}

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

评分

参与人数 2荣誉 +13 鱼币 +13 贡献 +11 收起 理由
拈花小仙 + 5 + 5 + 3 热爱鱼C^_^
小甲鱼 + 8 + 8 + 8 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-6 21:36:48 | 显示全部楼层
感谢无名侠分享,学到了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-5 08:58:31 | 显示全部楼层

好东西 谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 12:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表