题目链接:
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; }