九度oj 题目1391:顺时针打印矩阵
- 题目描述:
-
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
- 输入:
-
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行包括两个整数m和n(1<=m,n<=1000):表示矩阵的维数为m行n列。
接下来的m行,每行包括n个整数,表示矩阵的元素,其中每个元素a的取值范围为(1<=a<=10000)。
- 输出:
-
对应每个测试案例,输出一行,
按照从外向里以顺时针的顺序依次打印出每一个数字,每个数字后面都有一个空格。
- 样例输入:
-
- 4 4
- 1 2 3 4
- 5 6 7 8
- 9 10 11 12
- 13 14 15 16
- 4 4
- 样例输出:
-
- 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
- 这个题一开始是用哨兵的思想做的,在矩阵周围都设为0,碰到哨兵就转一个方向,开始设的哨兵值是0,结果一直超时,题目明明说 a >= 1的
只好设哨兵为-1了,代码如下
- #include <cstdio>
- #include <cstring>
- int matrix[][];
- int dir[][] = {{,},{,},{,-},{-,}};
- int main(int argc, char const *argv[])
- {
- int m, n;
- while(scanf("%d %d",&m,&n) != EOF) {
- for(int i = ; i < ; i++) {
- for(int j = ; j < ; j++) {
- matrix[i][j] = -;
- }
- }
- for(int i = ; i <= m; i++) {
- for(int j = ; j <= n; j++) {
- scanf("%d",&matrix[i][j]);
- }
- }
- int tx = , ty = ;
- int di = ;
- int num = m*n;
- int cnt = ;
- while(cnt < num) {
- tx = tx + dir[di][];
- ty = ty + dir[di][];
- while(matrix[tx][ty] != -) {
- printf("%d ",matrix[tx][ty]);
- matrix[tx][ty] = -;
- cnt++;
- tx = tx + dir[di][];
- ty = ty + dir[di][];
- }
- tx = tx - dir[di][];
- ty = ty - dir[di][];
- di = (di+) % ;
- }
- puts("");
- }
- return ;
- }
但是代码居然跑了980ms,
试着修改了一下,按四个方向判断输出
- #include <cstdio>
- #include <cstring>
- int matrix[][];
- int dir[][] = {{,},{,},{,-},{-,}};
- int main(int argc, char const *argv[])
- {
- int m, n;
- while(scanf("%d %d",&m,&n) != EOF) {
- for(int i = ; i < ; i++) {
- for(int j = ; j < ; j++) {
- matrix[i][j] = -;
- }
- }
- for(int i = ; i <= m; i++) {
- for(int j = ; j <= n; j++) {
- scanf("%d",&matrix[i][j]);
- }
- }
- int tx = , ty = ;
- int di = ;
- int num = m*n;
- int cnt = ;
- while(cnt < num) {
- int i;
- for(i = ty+; matrix[tx][i] != -; i++) {
- printf("%d ",matrix[tx][i]);
- cnt++;
- matrix[tx][i] = -;
- }
- ty = i-;
- for(i = tx+; matrix[i][ty] != -; i++) {
- printf("%d ",matrix[i][ty]);
- cnt++;
- matrix[i][ty] = -;
- }
- tx = i-;
- for(i = ty-; matrix[tx][i] != -; i--) {
- printf("%d ",matrix[tx][i]);
- cnt++;
- matrix[tx][i] = -;
- }
- ty = i+;
- for(i = tx-; matrix[i][ty] != -; i--) {
- printf("%d ",matrix[i][ty]);
- cnt++;
- matrix[i][ty] = -;
- }
- tx = i+;
- }
- puts("");
- }
- return ;
- }
跑了940ms
考虑时间这么长,是不是赋值语句导致的,只好换了个思路,用普通的界限来判断输出了
- #include <cstdio>
- #include <cstring>
- int matrix[][];
- int main(int argc, char const *argv[])
- {
- int m, n;
- while(scanf("%d %d",&m,&n) != EOF) {
- for(int i = ; i <= m; i++) {
- for(int j = ; j <= n; j++) {
- scanf("%d",&matrix[i][j]);
- }
- }
- int tx = , ty = ;
- int num = m*n;
- int cnt = ;
- int xt = m, yt = n, xf = , yf = ;
- while(cnt < num) {
- int i;
- for(i = ty+; i <= yt; i++) {
- printf("%d ",matrix[tx][i]);
- cnt++;
- }
- yt--;
- ty = i-;
- if(cnt == num) {
- break;
- }
- for(i = tx+; i <= xt; i++) {
- printf("%d ",matrix[i][ty]);
- cnt++;
- }
- xt--;
- tx = i-;
- if(cnt == num) {
- break;
- }
- for(i = ty-; i >= yf; i--) {
- printf("%d ",matrix[tx][i]);
- cnt++;
- }
- ty = i+;
- yf++;
- if(cnt == num) {
- break;
- }
- for(i = tx-; i >= xf; i--) {
- printf("%d ",matrix[i][ty]);
- cnt++;
- }
- tx = i+;
- xf++;
- }
- puts("");
- }
- return ;
- }
时间果然变少,只花了500ms
九度oj 题目1391:顺时针打印矩阵的更多相关文章
- 剑指Offer - 九度1391 - 顺时针打印矩阵
剑指Offer - 九度1391 - 顺时针打印矩阵2013-11-24 04:55 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 ...
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 九度oj 题目1007:奥运排序问题
九度oj 题目1007:奥运排序问题 恢复 题目描述: 按要求,给国家进行排名. 输入: 有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
- 九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
- 九度oj题目1002:Grading
//不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...
随机推荐
- Android商城开发系列(四)——butterknife的使用
在上一篇博客:Android商城开发系列(三)——使用Fragment+RadioButton实现商城底部导航栏实现商城的底部导航栏时,里面用到了butterknife,今天来讲解一下的butterk ...
- 在windows 上编译部署Rap2
在windows 上编译部署Rap2 引言 安装需要的环境 安装后端站点 创建数据库 在全局安装pm2 和 typescript 配置mysql,redis 数据库链接配置 初始化 编译 初始化数据库 ...
- Android(java)学习笔记125:保存数据到SD卡 (附加:保存数据到内存)
1. 如果我们要想读写数据到SD卡中,首先必须知道SD的路径: File file = new File(Environment.getExternalStorageDirectory()," ...
- Python-OpenCV——亮度和对比度
亮度与对比度 亮度调整是将图像像素的强度整体变大/变小,对比度调整指的是图像暗处变得更暗,亮出变得更亮,从而拓宽某个区域内的显示精度. OpenCV中亮度和对比度应用这个公式来计算:g(x) = αf ...
- Write Once, Run Anywhere:这不是Java,这是C#
注意,本文目的并非挑起语言之争.虽然有为C#平反之意,但主要还是介绍Mono并进行简单的测试. UPDATED: 25th August 2012 更新了「Compile Once, Run Anyw ...
- Bootstrap历练实例:向列表组添加链接
向列表组添加链接 通过使用锚标签代替列表项,我们可以向列表组添加链接.我们需要使用 <div> 代替 <ul> 元素.下面的实例演示了这点: <!DOCTYPE html ...
- Spring XML配置文件无法自动提示 eclipse中XML配置文件open with打开方式选择 XML Editor:注意它的编辑方式也是有两种的design和source
双击XML配置文件,如果打开方式不正确 则如下图: 都是灰色显示,不会有自动提示,也不会有颜色标注 右击XML配置文件,选择打开方式为XML Editor,则会有颜色标注 如果此时没有自动提示 则要手 ...
- iOS开发遇到的坑之六--使用cocopods管理第三方库时,编译出现Library not found for -lPods问题的解决办法
在项目中有时候会遇到Library not found for -lPods(这里的IPods指的是你具体的第三方库)的问题 出现这个错误的原因是:xcode在编译的时候找不到这个库,从而导致项目无法 ...
- C++函数的默认参数补充
1.函数定义时指定默认参数 在C++中,定义函数时可以给形参指定一个默认的值,这样调用函数时如果没有给这个形参赋值(没有对应的实参),那么就使用这个默认的值.也就是说,调用函数时可以省略有默认值的参数 ...
- mysql EOF
mysql shell 执行脚本 #!/bin/bash export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql-5.6/bin:/usr ...