您的位置:首页 > 理论基础 > 数据结构算法

将帅问题解读

2015-09-27 20:50 344 查看
即将毕业,现在温习一下数据结构和算法,方便出去找工作,几种典型的排序算法现在不温习先,现在先从经典算法题目开始。
原问题来自《编程之美》,书上提供几种算法不一一解读,只写看到问题想到的解法
原问题:
      下过中国象棋的朋友都知道,双方的“将”和“帅"相隔遥远,并且不能照面,在象棋残局中,学多高手能利用这一规则走出精妙的杀招。假设棋盘上只有“将”和“帅”二子,且只能在相对应的3*3的格子内运动,规则是将帅不能处于同一条直线上。请写出一个程序,输出A、B所有合法位置。要求在代码中只能使用一个字节存储变量。
初始想法:本想法忽略了只用一个字节储存变量的条件,只是为这个算法做一个引入。
      定义2个变量,分别对应将和帅能存放的位置,假设3*3的格子从左上到右下分别为1-9,然后用A、B变量分别存储将和帅的位置,所以我们可以得到将和帅分别处于第几行第几列的位置,就是(A/3)+1和A%3的关系。根据象棋的基本规则中,将和帅不能同时处于同一列,即是(A%3!=B%3)为真,所以使用2个变量的问题解决方案为:
 
#include<stdio.h>
int main(){
int a,b,c=0;
for(a=1;a<=9;a++){
for(b=1;b<=9;b++){
if(a%3!=b%3){
printf("将的位置:%d  帅的位置:%d\n",a,b);
c++;
}
}
}
printf("总位置数位:%d\n",c);
return 0;
}

上面的c变量忽略掉。。。纯粹是用来记录下拜访的位置数量的。

以上面算法为引,得到的是第一种算法,类型由int型变成了结构体,结构体中存放2个int型变量,然后算法中的变量就变成结构体类型的变量,代码如下:
#include<stdio.h>
struct {
int a;
int b;
} i;
int main(){
int c=0;
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("将的位置:%d  帅的位置:%d\n",i.a,i.b);
c++;
}
}
}
printf("总位置数位:%d\n",c);
return 0;
}


解法2:

#include<stdio.h>
int main(){
int i=81;
while(i--){
if(i/9%3!=i%9%3)
<span style="white-space:pre">			</span>printf("A:%d B:%d\t",i/9+1,i%9+1);
}
return 0;
}


非常精致的解法,起初在看到这个解法之前,自己只是根据3*3位置想到了一共81种放发,却无法得出这么精美的算法来,此算法的i表示的是81种位置的摆放方式,并对这81种方式进行遍历,判断表达式的左边计算的是A子的列位置,右边计算的是B子的列位置,当A、B不在同一列时,即是符合条件的位置。

表达式左边A的实际位置在(i/9)+1这个位置,B的实际位置在(i%9)+1这个位置,其实i就是AB位置数的乘积。

本题算法结果不难,但是要写的精美就有点麻烦,我们写算法就像建筑设计一样,不仅仅要做到实用性强,也要做到精致唯美。

第一次写blog,写的不好,以后会陆续写一点自己的学习笔记与心得,还有算法解读,有什么写的不到位的望指出。

这个编辑器有点坑。。。。。。。。。。。。完全和记事本一样的,写起来完全不像写blog。。。。。。。。。。。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息