将帅问题解读
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个变量的问题解决方案为:
上面的c变量忽略掉。。。纯粹是用来记录下拜访的位置数量的。
以上面算法为引,得到的是第一种算法,类型由int型变成了结构体,结构体中存放2个int型变量,然后算法中的变量就变成结构体类型的变量,代码如下:
解法2:
非常精致的解法,起初在看到这个解法之前,自己只是根据3*3位置想到了一共81种放发,却无法得出这么精美的算法来,此算法的i表示的是81种位置的摆放方式,并对这81种方式进行遍历,判断表达式的左边计算的是A子的列位置,右边计算的是B子的列位置,当A、B不在同一列时,即是符合条件的位置。
表达式左边A的实际位置在(i/9)+1这个位置,B的实际位置在(i%9)+1这个位置,其实i就是AB位置数的乘积。
本题算法结果不难,但是要写的精美就有点麻烦,我们写算法就像建筑设计一样,不仅仅要做到实用性强,也要做到精致唯美。
第一次写blog,写的不好,以后会陆续写一点自己的学习笔记与心得,还有算法解读,有什么写的不到位的望指出。
这个编辑器有点坑。。。。。。。。。。。。完全和记事本一样的,写起来完全不像写blog。。。。。。。。。。。。。。。。
原问题来自《编程之美》,书上提供几种算法不一一解读,只写看到问题想到的解法
原问题:
下过中国象棋的朋友都知道,双方的“将”和“帅"相隔遥远,并且不能照面,在象棋残局中,学多高手能利用这一规则走出精妙的杀招。假设棋盘上只有“将”和“帅”二子,且只能在相对应的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。。。。。。。。。。。。。。。。
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#数据结构揭秘一
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 数据结构之Treap详解
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总