经典算法

经典算法

魔方算法

 /*
   * 魔方算法
   * */

  public void MagicCube()
  { 
   Console.Write("请输入魔方的边长:");
   string strInput  = Console.ReadLine();
   int nBorderSize = Int32.Parse(strInput);  //边长
   
   int nRow,nCol;  //行,列
   nRow = 0;       //初始行为0
   nCol = nBorderSize / 2 ;//初始列为边长的一半
  
   int[,] array = new int[nBorderSize,nBorderSize];
  
   array[nRow,nCol] = 1;  //初始值为1
   for( int nCount = 2; nCount <= nBorderSize * nBorderSize; nCount++ )
    //从 2 到总数填充到数组中
   {
    if( nRow == 0 )  //如果行到最小边界,则转到最大边界
    {
     nRow = nBorderSize - 1;
    }
    else  //否则到上一行
    {
     nRow--;
    }
    if( nCol == nBorderSize -1 )  //如果列到最大边界,则转到最小边界
    {
     nCol = 0;
    }
    else  //否则到下一列
    {
     nCol++;
    }
    if( array[nRow,nCol] != 0 )  //如果当前位置已经有了元素,则转到下两行,前一列的位置
    {
     nRow += 2;
     if( nRow < 0 )  //如果行到最小边界,则转到最大边界
     {
      nRow = nBorderSize - 1;
     }
     if( nRow > nBorderSize - 1 )  //如果行到最大边界,则转到最小边界的下一行
     {
      nRow -= nBorderSize;
     }
     nCol--;
     if( nCol < 0)  //如果列到最小边界,则转到最大边界
     {
      nCol = nBorderSize - 1;
     }
    }
    array[nRow,nCol] = nCount;  //赋值
   }
   

   for( int i = 0; i < array.GetLength( 0 ); i++ )
   {
    for( int j = 0; j < array.GetLength( 1 ); j++ )
    {
     Console.Write( "{0}  ",array[i,j] );
     if( j ==  nBorderSize - 1 )  //输出一行的长度为边长,则到下一行输出
     {
      Console.WriteLine();
     }
    }
   } 
  }

螺旋算法(左下开始)

public void Helix()
  {
   Console.Write("请输入螺旋的边长:");
   string strInput  = Console.ReadLine();
   int nBorderSize = Int32.Parse(strInput);
   
   int[,] array = new int[nBorderSize,nBorderSize];
   int nDirect = 0;
   int nRow, nCol; //坐标
   nRow = 0;       //坐标从0,0开始
   nCol = 0;   
   for( int nCount = 1; nCount < nBorderSize * nBorderSize + 1; nCount++ )
    //从 2 开始赋值,一直到元素总数为止

   {
    
    array[nRow,nCol] = nCount;

    switch( nDirect )
    {
     case 0 :
      nRow = ( nRow + 1 + nBorderSize ) % nBorderSize;
      if( array[nRow,nCol] != 0 )
      {
       nDirect = ( nDirect + 1 ) % 4;
       nRow = ( nRow - 1 + nBorderSize ) % nBorderSize;
       nCol = ( nCol + 1 + nBorderSize ) % nBorderSize;
      }
      break;
     case 1 :
      nCol = ( nCol + 1 + nBorderSize ) % nBorderSize;
      if( array[nRow,nCol] != 0 )
      {
       nDirect = ( nDirect + 1 ) % 4;
       nCol = ( nCol - 1 + nBorderSize ) % nBorderSize;
       nRow = ( nRow - 1 + nBorderSize ) % nBorderSize;
      }
      break;
     case 2 :
      nRow = ( nRow - 1 + nBorderSize ) % nBorderSize;
      if( array[nRow,nCol] != 0 )
      {
       nDirect = ( nDirect + 1 ) % 4;
       nRow = ( nRow + 1 + nBorderSize ) % nBorderSize;
       nCol = ( nCol - 1 + nBorderSize ) % nBorderSize;
      }
      break;
     case 3 :
      nCol = ( nCol - 1 + nBorderSize ) % nBorderSize;
      if( array[nRow,nCol] != 0 )
      {
       nDirect = ( nDirect + 1 ) % 4;
       nCol = ( nCol + 1 + nBorderSize ) % nBorderSize;
       nRow = ( nRow + 1 + nBorderSize ) % nBorderSize;
      }
      break;
    }
   }
   for( int i = 0; i < array.GetLength( 0 ); i++ )
   {
    for( int j = 0; j < array.GetLength( 1 ); j++ )
    {
     Console.Write( "{0}  ",array[i,j] );
     if( j ==  nBorderSize - 1 )  //输出一行的长度为边长,则到下一行输出
     {
      Console.WriteLine();
     }
    }
   }

  }

奶牛繁殖算法

/*
 * 奶牛繁殖问题
 * */
  public void CowBreed()
  {
   Console.WriteLine("请输入年数:");
   string strInput = Console.ReadLine();
   int nYears = Int32.Parse(strInput);

   int[] array = new int[nYears];

   int nCowSum = 1;  //开始为一头
   array[0] = nCowSum;  //第一年为一头
   for( int nI = 1; nI < nYears ; nI++ )
   {
    if( nI < 3)  //前三年都为一头
    {
     nCowSum = 1;
    }
    else
    {
     nCowSum = nCowSum + array[nI - 3];  //今年的头数 = 去年的头数 + 倒数第三年的头数
    }
    array[nI] = nCowSum;
   }
   for(int nI = 1,nJ = 0; nJ < array.Length; nJ++ )
   {
    
    Console.WriteLine("第{0}年奶牛的头数为:{1},",nI,array[nJ]);
    nI++;
   }
  }
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值