技巧性的题 (P1079)

来源:互联网 发布:假知怎么造句 编辑:程序博客网 时间:2024/06/05 17:03

【问题描述】  
  给出N,请将 1、2、…、N*N 填入矩阵,要求按下列几种规律填写(例如N=4):

  1)、倒序矩阵:

      16 15 14 13
      12 11 10  9
       8  7  6  5
       4  3  2  1

  2)、盘旋矩阵

       1  2  3  4
       8  7  6  5
       9 10 11 12
      16 15 14 13

  3)、蛇形矩阵

      1  3  4 10
      2  5  9 11
      6  8 12 15
      7 13 14 16

  4)、螺旋矩阵

       1  2  3  4
      12 13 14  5
      11 16 15  6
      10  9  8  7

  注意,上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出。


对的就是这个无敌瞎螺旋矩阵现写吃过亏的....其实核心部分没有错不过还是归零了,并且试数据试了我很久.....读题的重要性


还是瞎分析一波..

前两个错了自觉吔si

后两个就有点蛇皮了..至少对于我这种低智商


主要还是用 while 并且要根据题目要求的初始方向来 比如螺旋矩阵...

for(;count<n*n;){while(j+1<=n&&shu3[i][j+1]==0){  shu3[i][++j]=++count; }while(i+1<=n&&shu3[i+1][j]==0){  shu3[++i][j]=++count; }while(j-1>=1&&shu3[i][j-1]==0){  shu3[i][--j]=++count; }while(i-1>=1&&shu3[i-1][j]==0){  shu3[--i][j]=++count; }}
开始先往右走,如果下一步超过了边界,就执行下一条 while ;

这样转了一圈,再从右开始走,现在如果一下格已经有数字了,就执行下一条while;

while的顺序 右 下 左 上

对于我来说还是很吼懂的(假装)


仔细一想  蛇皮矩阵好像也可以这么写》。。

#include<cstdio>using namespace std;int main(){int n;scanf("%d",&n);long long shu[201][201];long long k=1;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){shu[i][j]=k++;}}for(int i=n;i>=1;i--){for(int j=n;j>=1;j--){if(j!=1){printf("%d ",shu[i][j]);}else if(j==1){printf("%d\n",shu[i][j]);}}}printf("\n");for(int i=1;i<=n;i++){if(i%2!=0){for(int a=1;a<=n;a++){if(a!=n){printf("%d ",shu[i][a]);}else if(a==n){printf("%d\n",shu[i][a]);}}} else if(i%2==0) { for(int a=n;a>=1;a--) { if(a!=1) { printf("%d ",shu[i][a]); } else if(a==1) { printf("%d\n",shu[i][a]); } } }}printf("\n");long long shu2[201][201];shu2[1][1]=1;for(int j=2;j<=n;j++){if((j-1)%2==0){shu2[1][j]=shu2[1][j-1]+1;}if((j-1)%2==1){shu2[1][j]=shu2[1][j-1]+(j-1)*2;}} for(int i=2;i<=n;i++){if(i%2==0){int he=i+1;for(int b=i,a=he-b;b>=1,a<=n;a++,b--){if(a<=n&&a>=2&&b>=1&&b<=n)shu2[a][b]=shu2[a-1][b+1]-1;}}if(i%2==1){int he=i+1;for(int b=i,a=he-b;b>=1,a<=n;a++,b--){if(a<=n&&a>=2&&b>=1&&b<=n)shu2[a][b]=shu2[a-1][b+1]+1;}}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)          {   if(shu2[i][j]!=0) shu2[n+1-i][n+1-j]=n*n+1-shu2[i][j];    }}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(j!=n){printf("%d ",shu2[i][j]);}if(j==n){printf("%d\n",shu2[i][j]);}}}printf("\n");long long shu3[201][201];int i=1;int j=1;shu3[1][1]=1;long long count=1;for(;count<n*n;){while(j+1<=n&&shu3[i][j+1]==0){  shu3[i][++j]=++count; }while(i+1<=n&&shu3[i+1][j]==0){  shu3[++i][j]=++count; }while(j-1>=1&&shu3[i][j-1]==0){  shu3[i][--j]=++count; }while(i-1>=1&&shu3[i-1][j]==0){  shu3[--i][j]=++count; }}for(int a=1;a<=n;a++){for(int b=1;b<=n;b++)    {printf("%lld ",shu3[a][b]);}printf("\n");}return 0;}

原创粉丝点击