算法分析与设计实验

经典的数字旋转方阵问题,怎么解决呢?

当然是递归一下,如下图,将方阵分成A,B,C,D四部分;

A 部分:每次随着数字 number 的增加,行号 i 也随之增加,列号 j 保持不变,填充到二维数组 data 中;
B 部分:每次随着数字 number 的增加,行号 i 保持不变,列号 j 随之增加,填充到二维数组 data 中;
C 部分:每次随着数字 number 的增加,行号 i 不断递减,列号 j 保持不变,填充到二维数组 data 中;
D 部分:每次随着数字 number 的增加,行号 i 保持不变,列号 j 不断递减,填充到二维数组 data 中。

除了注意到这些规律,还应该发现,每个区域只填充 方阵宽度 size - 1 。
在这里插入图片描述

完整代码如下:

#include <iostream>
#include <string.h>
#include <algorithm>
#define inf 0x3f3f3f3f
typedef long long LL;
using namespace std;
// 输入:当前层左上角要填写的数字 number 
// 左上角坐标 begin 方阵的阶数 size 
int data[8][8];
void Full(int number, int begin, int size) {
	if(size == 0) {
		return;
	}
	if(size == 1) {
		data[begin][begin] = number;
		return;
	}
	int i = begin, j = begin;
	for(int k = 0; k < size - 1; k++) {
		data[i][j] = number;
		number++, i++; 
	}
	for(int k = 0; k < size - 1; k++) {
		data[i][j] = number;
		number++, j++;
	}
	for(int k = 0; k < size - 1; k++) {
		data[i][j] = number;
		number++, i--;
	}
	for(int k = 0; k < size - 1; k++) {
		data[i][j] = number;
		number++, j--;
	}
	Full(number, begin+1, size-2);
} 
int main(){
	int num = 0, start = 0, sizee = 0;
	cout << "请输入左上角的数字:" << endl;
	cin >> num;
	cout << "请输入左上角的坐标:" << endl;
	cin >> start;
	cout << "请输入方阵的阶数:" << endl;
	cin >> sizee;
	Full(num, start, sizee); 
	cout << "构造的数字旋转矩阵如下:" << endl;
	for(int i = 0; i <= sizee; i ++) {
		for(int j = 0; j <= sizee; j++) {
			if(i == 0 || j == 0) {
				if(i == 0 && j != 0) {
					printf("\t第%d列", j);
				}
				else if(j == 0 && i != 0) {
					printf("\t第%d行", i);
				}
				else {
					printf("\t");
				}
			}
			else {
				printf("\t%d", data[i][j]);
			}
		}
		cout << endl;
		cout << endl;
	}
	return 0;
}

效果图如下:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法分析基础——Fibonacci序列问题 分治法在数值问题中的应用——最近点对问题 减治法在组合问题中的应用——8枚硬币问题 变治法在排序问题中的应用——堆排序问题 动态规划法在图问题中的应用——全源最短路径问题 3. 实验要求 (1)实现Floyd算法; (2)算法的输入可以手动输入,也可以自动生成; (3)算法不仅要输出从每个顶点到其他所有顶点之间的最短路径,还有输出最短路径的长度; (4)设计一个权重为负的图或有向图的例子,对于它,Floyd算法不能输出正确的结果 3. 实验要求 1)设计与实现堆排序算法; 2)待排序的数据可以手工输入(通常规模比较小,10个数据左右),用以检测程序的正确性;也可以计算机随机生成(通常规模比较大,1500-3000个数据左右),用以检验(用计数法)堆排序算法的时间效率 3. 实验要求 1)设计减治算法实现8枚硬币问题; 2)设计实验程序,考察用减治技术设计算法是否高效; 3)扩展算法,使之能处理n枚硬币中有一枚假币的问题。 3. 实验要求 1)使用教材2.5节中介绍的迭代算法Fib(n),找出最大的n,使得 第n个Fibonacci数不超过计算机所能表示的最大整数,并给出具体的执行时间; 2)对于要求1),使用教材2.5节中介绍的递归算法F(n)进行计算,同样给出具体的执行时间,并同1)的执行时间进行比较; 3)对于输入同样的非负整数n,比较上述两种算法基本操作的执行次数; 4)对1)中的迭代算法进行改进,使得改进后的迭代算法其空间复杂度为Θ(1); 5)设计可供用户选择算法的交互式菜单(放在相应的主菜单下)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值