经典算法

    技术2022-05-11  10

    经典算法

    魔方算法

     /*   * 魔方算法   * */

      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)