題目連結:
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;}