pat basic 1050 螺旋矩阵
pat basic 1050
螺旋矩阵
本来没头绪,后来看了视频,然后有思路了;
思路:总共有四个方向的移动,考虑上下左右边界~
但是,还是不能全通过,害 * - *,搞了四五个小时,还是没找出来。
代码如下:
#include<iostream> #include<cmath> #include<algorithm> using namespace std; int s[10000][10000]={0}; int a[10010]; int main(){ int c,row,col; scanf("%d",&c) ; for( col=sqrt(c);col>0;col--){ if(c%col==0){ row=c/col; break; } } int top=0,bottom=row-1,left=0,right=col-1; for(int i=0;i<c;i++) scanf("%d",&a[i]); int k=0; sort(a,a+c,greater<int>() ); while(top<=bottom&&left<=right) { for(int j=left;j<=right;j++) { s[top][j]=a[k]; k++; } top++; for(int i=top;i<=bottom;i++){ s[i][right]=a[k]; k++; } right--; for(int j=right;j>=left;j--){ s[bottom][j]=a[k]; k++; } bottom--; for(int i=bottom;i>=top;i--){ s[i][left]=a[k]; k++; } left++; } for(int i=0;i<row;i++){ for(int j=0;j<col;j++){ if(j!=col-1) printf("%d ",s[i][j]); else printf("%d\n",s[i][j]); } } return 0; }
![](https://img2020.cnblogs.com/i-beta/1875802/202003/1875802-20200314160855026-1909728756.png)
我明白了!!!
原来是我对于 while语句错误的认知 所导致的错误;
正确的代码:
#include<iostream> #include<cmath> #include<algorithm> using namespace std; int s[10000][10000]={0}; int a[10010]; int main(){ int c,row,col; scanf("%d",&c) ; for( col=sqrt(c);col>0;col--){ if(c%col==0){ row=c/col; break; } } int top=0,bottom=row-1,left=0,right=col-1; for(int i=0;i<c;i++) scanf("%d",&a[i]); int k=0; sort(a,a+c,greater<int>() ); while(top<=bottom&&left<=right) { for(int j=left;j<=right;j++) { s[top][j]=a[k]; k++; } top++; if(top>bottom) break; //一直以为这一句没必要,以为while开头就已经判断好了,后来才知道,while循环 是先执行完所有语句,然后再判断一次的 for(int i=top;i<=bottom;i++){ s[i][right]=a[k]; k++; } right--; if(left>right) break; for(int j=right;j>=left;j--){ s[bottom][j]=a[k]; k++; } bottom--; if(bottom<top) break; for(int i=bottom;i>=top;i--){ s[i][left]=a[k]; k++; } left++; if(left>right) break; } for(int i=0;i<row;i++){ for(int j=0;j<col;j++){ if(j!=col-1) printf("%d ",s[i][j]); else printf("%d\n",s[i][j]); } } return 0; }
无聊就学习 反正没事干