您的位置:首页 > 其它

题目8:顺时针打印矩阵

2012-10-11 20:28 267 查看
题目:http://ac.jobdu.com/problem.php?cid=1039&pid=7

题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
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


样例输出:
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10


本题的题意就是输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字!题目很简单,只要控制扫描的方向就可以解决问题,并且标记,就可以直接按要求扫描所有数字一次!!
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <string.h>
#include <algorithm>
#include <cmath>
using namespace std;

#define N 1010

int p

;
bool vis

;//标记数组

int main()
{
int n,m,i,j;
int dir,tot;
while(scanf("%d %d",&n,&m) == 2)
{
for(i = 0;i < n;i++)
for(j = 0;j < m;j++)
scanf("%d",&p[i][j]);
memset(vis,0,sizeof(vis));
tot = vis[i = 0][j = 0] = 1;
printf("%d ",p[i][j]);
while(tot <n*m)//分为四个方向
{
while(j + 1 < m&&!vis[i][j+1])//向右
{
printf("%d ",p[i][j+1]);
j++;
vis[i][j] = 1;
tot++;
}
while(i + 1 < n&&!vis[i + 1][j])//向下
{
printf("%d ",p[i + 1][j]);
i++;
vis[i][j] = 1;
tot++;
}
while(j - 1 >= 0&&!vis[i][j - 1])//向左
{
printf("%d ",p[i][j-1]);
j--;
vis[i][j] = 1;
tot++;
}
while(i - 1 >= 0&&!vis[i - 1][j])//向上
{
printf("%d ",p[i -1][j]);
i--;
vis[i][j] = 1;
tot++;
}
}
printf("\n");

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: