将帅问题解读

即将毕业,现在温习一下数据结构和算法,方便出去找工作,几种典型的排序算法现在不温习先,现在先从经典算法题目开始。

原问题来自《编程之美》,书上提供几种算法不一一解读,只写看到问题想到的解法

原问题:

      下过中国象棋的朋友都知道,双方的"相隔遥远,并且不能照面,在象棋残局中,学多高手能利用这一规则走出精妙的杀招。假设棋盘上只有二子,且只能在相对应的3*3的格子内运动,规则是将帅不能处于同一条直线上。请写出一个程序,输出AB所有合法位置。要求在代码中只能使用一个字节存储变量。

初始想法:本想法忽略了只用一个字节储存变量的条件,只是为这个算法做一个引入。

      定义2个变量,分别对应将和帅能存放的位置,假设3*3的格子从左上到右下分别为1-9,然后用AB变量分别存储将和帅的位置,所以我们可以得到将和帅分别处于第几行第几列的位置,就是(A/3)+1A%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型变成了结构体,结构体中存放2int型变量,然后算法中的变量就变成结构体类型的变量,代码如下:

#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。。。。。。。。。。。。。。。。骂人

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值