首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

模拟 来型矩阵 zstu-3897

2012-12-16 
模拟回型矩阵zstu-3897 题目链接:http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id3897 题

模拟 回型矩阵 zstu-3897

 

题目链接:

http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id=3897

 

题目意思:

要求输出一个n*m 的矩阵,规则:按照回型的方式依次录入元素1—n*m,先从左到右,再从上到下,然后从右到左,然后从下到上,一直循环下去,直到所有的数都输入完了。

 

解题思路:

设置一个变量p计数外圈回型数量,由外及内依次录入元素,当录入元素个数为n*m时,停止录入。

为了统一处理,在录入每一个回型圈时,每个方向均录入元素个数比当前矩阵规模少一。具体详见代码.

 

代码:

#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>#include<vector>#include<map>#define eps 1e-6#define INF (1<<20)#define PI acos(-1.0)using namespace std;int save[120][120];int main(){    int m,n;    while(scanf("%d%d",&n,&m)!=EOF)    {        int p=1,num=0,sum=n*m,flag=0;  //sum为总个数        while(true)        {            //从左向右            for(int j=p;j<=m-p;j++)            {                num++;                save[p][j]=num;                if(num==sum) //结束                {                    flag=1;                    break;                }            }            if(flag==1)                break;            //从上向下            for(int i=p;i<=n-p;i++)            {                num++;                save[i][m-p+1]=num;                if(num==sum)                {                    flag=1;                    break;                }            }            if(flag==1)                break;            //从右向左            for(int j=m-p+1;j>p;j--)            {                num++;                save[n-p+1][j]=num;                if(num==sum)                {                    flag=1;                    break;                }            }            if(flag==1)                break;            //从下向上            for(int i=n-p+1;i>p;i--)            {                num++;                save[i][p]=num;                if(num==sum)                {                    flag=1;                    break;                }            }            if(flag==1)                break;            p++;        }        for(int i=1;i<=n;i++)        {            printf("%2d",save[i][1]);            for(int j=2;j<=m;j++)                printf("%3d",save[i][j]);            putchar('\n');        }    }    return 0;}


 

 

热点排行