zoukankan      html  css  js  c++  java
  • 1044: 数圈

    1044: 数圈

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 231  解决: 97
    [提交][状态][讨论版]

    题目描述

    以1为中心,用2,3,4, ..., n, ..., n*n的数字围绕着中心输出数圈, 如若n=4,则

    7 8 9 10

    6 1 2 11

    5 4 3 12

    16 15 14 13

    输入

    一个整数n(1<=n<=10)

    输出

    数圈矩阵

    样例输入

    5

    样例输出

    21 22 23 24 25
    20 7 8 9 10
    19 6 1 2 11
    18 5 4 3 12
    17 16 15 14 13

    提示

     

    来源

    #include <iostream>
    using namespace std;
    int main(){
     int i,j,n;
     int a[10][10]={{73,74,75,76,77,78,79,80,81,82},
     {72,43,44,45,46,47,48,49,50,83},
     {71,42,21,22,23,24,25,26,51,84},
     {70,41,20,7,8,9,10,27,52,85},
     {69,40,19,6,1,2,11,28,53,86},
     {68,39,18,5,4,3,12,29,54,87},
     {67,38,17,16,15,14,13,30,55,88},
     {66,37,36,35,34,33,32,31,56,89},
     {65,64,63,62,61,60,59,58,57,90},
     {100,99,98,97,96,95,94,93,92,91}};
     while(cin>>n){
       if(n==1) cout<<1<<endl;
       else if(n==2){
        cout<<1<<" "<<2<<endl;
        cout<<4<<" "<<3<<endl;
       }
          else if(n%2!=0){
           for(i=4-n/2;i<=4+n/2;i++){
             for(j=4-n/2;j<=4+n/2;j++){
              if(j==4+n/2) cout<<a[i][j];
              else
              cout<<a[i][j]<<" ";
             }
             cout<<endl;
           }
          }else{
           for(i=4-(n/2-1);i<=4+n/2;i++){
             for(j=4-(n/2-1);j<=4+n/2;j++){
              if(j==4+n/2) cout<<a[i][j];
              else
              cout<<a[i][j]<<" ";
             }
             cout<<endl;
           }
          }
     }
     return 0;
    }

    以上代码有点蛮干,下面才是正确的代码思路:

    #include<iostream>
    using namespace std;
    int d,x,y,a[1000][1000];
    void move(){
    switch(d){
    case 0:
    y++;return;
    case 1:
    x++;return;
    case 2:
    y--;return;
    case 3:
    x--;return;
    }
    }
    int main(){
    int n,c=1;
    cin>>n;
    y=x=(n-1)/2;
    a[x][y]=c;
    c++;
    d=0;
    move();
    a[x][y]=c;
    c++;
    d=(d+1)%4;
    for(int i=1;i<n;i++){
    for(int j=0;j<i;j++){
    move();  //某个方向走i步,如向下
    a[x][y]=c;
    c++;
    }
    d=(d+1)%4;
    for(int j=0;j<i;j++){
    move(); //再向左走i步
    a[x][y]=c;
    c++;
    }
    move(); //再向左走一步,此时d这个方向值不变
    a[x][y]=c;
    c++;
    d=(d+1)%4;//走完之后方向发生改变
    }
    for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
    if(j==0)cout<<a[i][j];
    else cout<<" "<<a[i][j];
    }
    cout<<endl;
    }
    }

  • 相关阅读:
    每日英语:Italian town fighting for its life over polluting Ilva steelworks
    SpringBoot + Kafka + ELK 完成海量日志收集(超详细)
    如何使用 Java 生成二维码?
    xyntservice
    windows service 与GUI窗口的实现
    一个可以查看HTML网页上密码框的程序(附源码)
    vss6 forgot admin password
    vs2005's addin folder
    javascript tips
    html中使用imagemap
  • 原文地址:https://www.cnblogs.com/lchzls/p/5781777.html
Copyright © 2011-2022 走看看