当前位置: 首页 > news >正文

做建材的网站/北京网络营销咨询公司

做建材的网站,北京网络营销咨询公司,网站后台管理系统怎么做,有哪些网站可以学做糕点的问题描述   回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。 输入格式   输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数&#xf…

问题描述
  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
  输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
  输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出
1 4 7 8 9 6 3 2 5
样例输入
3 2
1 2
3 4
5 6
样例输出
1 3 5 6 4 2

我设计了三种算法来解决此道题目,并通过对算法的分析,来看该三种算法的优劣。

  1. 算法设计:(递归法)
    矩阵由四个边组成,回型取数在不同的边上取数方向不同,因此可以分为四种情况来取数。通过一个数s取余4来对应四个状态,通过递归算法来输出每个数,当每边的数取完时就使s加一来取另外一边的数(if…else…实现)。
    递归时传参传的是每个数的行列值。例如:
    当取完a【i】【j】时,若s=0时,对应取的是左边即向下取数,则传参数solve(i+1,j);若s=3时,对应取的是上边即向左取数,则传参数solve(i,j-1)。
#include <stdio.h>
#include <string.h>
#define N 10
#define M 10int s=0;
int m,n;
int a[M][N],b[M][N];
void solve(int i,int j){if(i>=0&&i<m&&j>=0&&j<n&&b[i][j]==0){printf("%d ",a[i][j]);b[i][j]=1;}else  s++;if (s%4==0)               //右侧solve(i+1,j);if(s%4==1)               //下方solve(i,j+1);if(s%4==2)               //左侧solve(i-1,j);if(s%4==3)               //上方solve(i,i-1);}int main()
{ int i,j;scanf("%d%d",&m,&n);memset(b,0,sizeof(b));for(i=0;i<m;i++){ for (j=0;j<n;j++)scanf("%d",&a[i][j]);printf("\n");}solve(0,0);return 0;}

2、算法设计:逐圈分析分别处理每圈的左侧、下方、右方、上方的数据。先计算可分为几圈,由于每转一圈行上的个数会减少2个,因此看可以减少几个2就有几圈,用行数除以2可算出有几圈。(若行数为奇数,也是除二向下取整可举例实验)。
i 层内输出数据的4个过程为(四角元素分别归四个边):
(1) i 列(左侧),从 i 行到m-i-1 行;
(2) m-i-1行(下方),从 i 列到 n-i -1列;
(3) n-i-1 列(右侧),从 m-i-1 行到 i+1 行;
(4)i 行(上方),从 n-i-1 列到 i 列;
4个过程通过4个循环实现,用 j 表示 i 层内每边中行或列的下标。

#include <stdio.h>
#include <string.h>
#define M 10
#define N 10void solve()
{}
int main(){int a[M][N];int m,n,i,j;scanf("%d%d",&m,&n);for(i=0;i<m;i++)for(j=0;j<n;j++)scanf("%d",&a[i][j]);//开始取数for(i=0;i<m/2;i++)
{for(j=i;j<m-i-1;j++)          //左侧printf("%d",a[j][i]);for(j=i;j<n-i-1;j++)printf("%d",a[m-i-1][j]); //下方for(j=m-i-1;j>i;j--)printf("%d",a[j][n-i-1]); //右侧for(j=n-i-1;j>i;j--)printf("%d",a[i][j]);     //上方
}

3、算法设计:(算法设计数p.83)通过设置变量标识一圈中不同方位的处理差别,并通过算术运算将4个方位的处理归结成一个循环过程。
通过输出最外一圈的情况分析:

j=1i=i+10~n-1k=n左侧
i=nj=j+11~n-1k=n-1下方
j=ni=i-1n-2~0k=n-1右侧
i=1j=j+1n-2~0k=n-2上方

从上面i,j 的变化可发现:输出时,前半圈下标变化一致,都加1;后半圈都减1,不同的是变化范围,所以分两边前半圈和后半圈,引入t=1,每半圈改变t的正负号再进行行列值改变。
前半圈再分左边与下边,可知前m个数是左边,后n-1是下边,在此引入两值b【0】与b【1】,当第i个数取余m等于0时则为左边的数,因为(i从0取所以还是m个数)等于1则为下边的数。后半圈同理。。
为表达,要统一表示循环变量的范围,可发现当输出到左下角时行列数少一,右上角行列数又少一,因此在进行半圈输出后,要对行列值减一。

#include <stdio.h>
#include <string.h>
#define M 10
#define N 10
int main(){int a[M][N];int b[2];int m,n,x,y,i,j;int t=1;b[0]=-1;b[1]=0;scanf("%d%d",&m,&n);for(i=0;i<m;i++)for(j=0;j<n;j++)scanf("%d",&a[i][j]);//开始取数while(x<=m*n){for(y=0;y<(m+n-1);y++){ b[y/m]+=t;printf("%d",a[b[0]][b[1]]);x++;}m--;n--;t=-t;}return 0;
}

三种算法比较及学习心得:
算法 1、2比较好理解,在思考方面可以节约大量时间,算法也是相通的,体现了递归和循环的相互转换;
算法 3 需要通过归纳,构造循环不变式,写出的算法节约了运行时的时间。
比较偏向算法1,好理解,清晰明了,递归总是用很简单的语句实现了很复杂的过程,因此我很喜欢读递归程序。
通过算法三了解到,要善于通过数学归纳构造不变式,这也是一个写算法很好的习惯。

ps:第一次写博客,意犹未尽,之前以为完全掌握的在总结的时候还是会有磕绊的地方,通过写博客也是将该问题又踏平了不少,以后这个习惯还是要坚持的,是提高也是个记录与回忆吧,今天算是个好的开端吧?嘿嘿嘿。。
对了,浏览过有问题的话,我们再一起探讨啊!

http://www.lbrq.cn/news/1040635.html

相关文章:

  • 郑州给公司做网站的公司/如何建立网址
  • 做行业门户网站要投资多少钱/搜索引擎营销的特点是什么
  • 阿里网站备案/最全的百度网盘搜索引擎
  • 合肥专门做网站的公司/网络营销推广的基本手段
  • 网站制作经典案例/百度问答库
  • 国外外贸需求网站/seo百度推广
  • 成都锦江规划建设局网站/企业网站建设的基本流程
  • 做的网站怎么让别人也能看到/seo快速提升排名
  • wordpress 去掉描述的超链接/莆田seo推广公司
  • 手把手教你做网站视频/济南seo优化外包服务
  • 网站建设服务 杭州/营销型网站设计
  • 河南政务网站建设排名/2023新闻热点摘抄
  • 临猗做网站/品牌策略的7种类型
  • 慈溪做网站的公司/2022年seo还值得做吗
  • 做网站必须原创吗/网页设计参考网站
  • 北京欢迎您网站建设/百度网址怎么输入?
  • 网站推广 营销/百度投稿平台
  • 做网站常见问题模板/长沙网络推广小公司
  • php网站后台开发/2345网址导航是病毒吗
  • 成都购物网站建设/百度推广后台登陆首页
  • 资阳网站建设/广州营销课程培训班
  • 电子商务网站的建设心得/sem和seo的关系
  • wordpress封面/安徽seo顾问服务
  • 长春网站/百度搜索引擎首页
  • 德阳建设公司网站/网络营销做得好的品牌
  • 馨端网站建设/百度成都总部
  • 青海网站建设/世界营销大师排名
  • 徐州市建设局网站首页/新型营销方式
  • 东莞家居网站建设/军事网站大全军事网
  • 草桥有做网站公司吗/百度seo如何优化
  • sqli-labs通关笔记-第42关 POST字符型堆叠注入(单引号闭合 手工注入+脚本注入两种方法)
  • Spring MVC 注解参数接收详解:@RequestBody、@PathVariable 等区别与使用场景
  • MySQL中GROUP_CONCAT函数的使用详解
  • 【深度学习3】向量化(Vectorization)
  • C++ list类
  • C++算法练习:单词识别