【PAT乙级】1050 螺旋矩阵

    科技2022-08-29  95

    题目链接:1050 螺旋矩阵

    结果

    思路

    中规中矩地输入数据,用数组保存,sort排序。从根号N开始寻找m,n值。这题的主要部分:螺旋填充。我用的办法是记录边界,已经填充完毕的边进行缩进,在剩余部分里继续填充。填充位移动策略优先度依次为: -靠左边且不靠上边与右边则向上移动 -靠下边且不靠左边则向左移动 -靠右边且不靠下边则向下移动 -靠上边且不靠右边则向右移动边界缩进策略: 首次进入以上4中移动策略时,将上一策略经过的位置排除出边界。中规中矩地输出数据。 代码写得十分丑陋,大佬轻喷。

    代码

    #include <iostream> #include <algorithm> #include <math.h> using namespace std; int main(){ int N,m,n; cin >> N; int a[N]; for(int i=0;i<N;i++) cin >> a[i]; //找到m,n值 for(m=sqrt(0.0+N); N % m || m < N/m; m++); sort(a,a+N); n = N / m; int b[m][n]; int left=0,right=n-1,up=0,down=m-1,x=0,y=0,flag=0; //依据当前位置与边界的关系一边螺旋填充,一边修改边界 for(int i=N-1;i>=0;i--){ b[x][y] = a[i]; if(y == left && x != up && y != right){ if(flag!=1){ flag = 1; down--; } x--; } else if(x == down && y != left){ if(flag!=2){ flag = 2; right--; } y--; } else if(y == right && x != down){ if(flag!=3){ flag = 3; up++; } x++; } else if(x == up && y != right){ if(flag!=0){ flag = 0; left++; } y++; } } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ cout << b[i][j]; if(j!=n-1) cout << ' '; else if(i!=m-1) cout << endl; } } return 0; }
    Processed: 0.020, SQL: 9