zoukankan      html  css  js  c++  java
  • 蛇形填数

    今天在笔试遇到的题。

    在n*n的矩阵里填入1,2,...,n*n,要求填成蛇形。例如n=4时矩阵为:
    10 11 12 1
    9   16 13 2
    8   15 14 3
    7    6   5  4

    一般思路

    1)0初始化一个二位数组

    2)从右上角开始往下走,直到某节点的下面节点不是 0 或者越界(判断条件),就往左走,然后往上走,往右走

    3)重复操作,直到数组没有0

     1 #include <stdio.h>
     2 int k=1;//用来累加到数组
     3 int qn;
     4 void fun(int (*a)[qn],int x,int y,int n)
     5 {
     6     if(a[x][y]!=0)
     7         return;
     8     while(a[x][y]==0)
     9     {
    10         a[x][y]=k++;
    11         if(x+1==n||a[x+1][y]!=0)
    12         {
    13             y--;
    14             break;
    15             
    16         }
    17         x++;
    18     }
    19     while(a[x][y]==0)
    20     {
    21         a[x][y]=k++;
    22         if(y-1==-1||a[x][y-1]!=0)
    23         {
    24             x--;
    25             break;
    26             
    27         }
    28         y--;
    29     }
    30 
    31     while(a[x][y]==0)
    32     {
    33         a[x][y]=k++;
    34         if(x-1==-1||a[x-1][y]!=0)
    35         {
    36             y++;
    37             break;
    38             
    39         }
    40         x--;
    41     }
    42 
    43     while(a[x][y]==0)
    44     {
    45         a[x][y]=k++;
    46         if(y+1==n||a[x][y+1]!=0)
    47         {
    48             x++;
    49             break;
    50             
    51         }
    52         y++;
    53     }
    54 
    55     fun(a,x,y,--n);
    56     return ;
    57         
    58     
    59 }
    60 
    61 int main()
    62 {
    63     int n;
    64     scanf("%d",&n);
    65     qn=n;
    66     int a[n][n];
    67     for(int i=0;i<n;i++)
    68     for(int j=0;j<n;j++)
    69         a[i][j]=0;
    70     fun(a,0,n-1,n);
    71     for(int i=0;i<n;i++)
    72     for(int j=0;j<n;j++)
    73     {
    74         
    75         printf("%d ",a[i][j]);
    76         if(j==n-1)
    77             printf("
    ");
    78     }
    79 }

    换个思路:

    其实这是个4-联通问题

    从右上角开始,每个节点依次:向下走->向左走->向上走->向右走

     1 #include <stdio.h>
     2 
     3 int k=1;//用来累加到数组
     4 int qn;
     5 void fun(int (*a)[qn],int x,int y,int n)
     6 {    
     7     if(a[x][y]==0 && x<n && y<n && x>=0 && y>=0)    
     8     {
     9         a[x][y]=k++;
    10         if(a[x][y+1]!=0||y+1==n)
    11             fun(a,x+1,y,n);//向下
    12         fun(a,x,y-1,n);//向左
    13         fun(a,x-1,y,n);//向上
    14         fun(a,x,y+1,n);//向右
    15         
    16         
    17     }    
    18 }
    19 
    20 int main()
    21 {
    22     int n;
    23     scanf("%d",&n);
    24     qn=n;
    25     int a[n][n];
    26     for(int i=0;i<n;i++)
    27     for(int j=0;j<n;j++)
    28         a[i][j]=0;
    29     fun(a,0,n-1,n);
    30     for(int i=0;i<n;i++)
    31     for(int j=0;j<n;j++)
    32     {
    33         
    34         printf("%d ",a[i][j]);
    35         if(j==n-1)
    36             printf("
    ");
    37     }
    38 }
  • 相关阅读:
    iOS无限循环滚动scrollview
    SDWebImage实现原理(怎么实现图片缓存器)
    CocoaPods第三方库管理 iOS
    什么时候会报unrecognized selector的异常?
    iOS提交后申请加急审核
    iOS 个人账号 iOS APP Development 灰色不可选
    Xcode6 管理provisioning profile
    iOS苹果推送功能实现步骤
    蓝桥杯 幸运数
    hihocoder编程练习赛52-3 部门聚会
  • 原文地址:https://www.cnblogs.com/firstcxj/p/4834052.html
Copyright © 2011-2022 走看看