zoukankan      html  css  js  c++  java
  • 棋盘覆盖问题&循环赛日程表问题

    ---恢复内容开始---

    简单的分治,曾经看了好久想了好久也不会的随着时间变成最简单的题,由于刘汝佳书上说的不多,网上找到的又总是一个湖南OJ上的题(看都不愿意看)所以我还是仅说一下思想吧。

    棋盘覆盖问题:

    我觉得核心问题是在找不到特殊方格是假设了3个方格做特殊方格使分治继续。

    循环赛日程表相对就脑残多了,关键是找到规律,然后分治问题到只有2*2的表格,(已经打好了),然后一点点按照规律打印其他小单位。

    由于这题找到了原题,(并且很简单)我就把自己代码复制一下,棋盘覆盖问题是在网上找的,可以用来看一看思想。

    棋盘覆盖问题:

     1 #include<iostream>
     2 using namespace std;
     3 int tile=1;                   //L型骨牌的编号(递增)
     4 int board[100][100];  //棋盘
     5 /*****************************************************
     6 * 递归方式实现棋盘覆盖算法
     7 * 输入参数:
     8 * tr--当前棋盘左上角的行号
     9 * tc--当前棋盘左上角的列号
    10 * dr--当前特殊方格所在的行号
    11 * dc--当前特殊方格所在的列号
    12 * size:当前棋盘的:2^k
    13 *****************************************************/
    14 void chessBoard ( int tr, int tc, int dr, int dc, int size )
    15 {
    16     if ( size==1 )    //棋盘方格大小为1,说明递归到最里层
    17         return;
    18     int t=tile++;     //每次递增1
    19     int s=size/2;    //棋盘中间的行、列号(相等的)
    20     //检查特殊方块是否在左上角子棋盘中
    21     if ( dr<tr+s && dc<tc+s )              //
    22         chessBoard ( tr, tc, dr, dc, s );
    23     else         //不在,将该子棋盘右下角的方块视为特殊方块
    24     {
    25         board[tr+s-1][tc+s-1]=t;
    26         chessBoard ( tr, tc, tr+s-1, tc+s-1, s );
    27     }
    28     //检查特殊方块是否在右上角子棋盘中
    29     if ( dr<tr+s && dc>=tc+s )               //
    30         chessBoard ( tr, tc+s, dr, dc, s );
    31     else          //不在,将该子棋盘左下角的方块视为特殊方块
    32     {
    33         board[tr+s-1][tc+s]=t;
    34         chessBoard ( tr, tc+s, tr+s-1, tc+s, s );
    35     }
    36     //检查特殊方块是否在左下角子棋盘中
    37     if ( dr>=tr+s && dc<tc+s )              //
    38         chessBoard ( tr+s, tc, dr, dc, s );
    39     else            //不在,将该子棋盘右上角的方块视为特殊方块
    40     {
    41         board[tr+s][tc+s-1]=t;
    42         chessBoard ( tr+s, tc, tr+s, tc+s-1, s );
    43     }
    44     //检查特殊方块是否在右下角子棋盘中
    45     if ( dr>=tr+s && dc>=tc+s )                //
    46         chessBoard ( tr+s, tc+s, dr, dc, s );
    47     else         //不在,将该子棋盘左上角的方块视为特殊方块
    48     {
    49         board[tr+s][tc+s]=t;
    50         chessBoard ( tr+s, tc+s, tr+s, tc+s, s );
    51     }
    52 }
    53 
    54 void main()
    55 {
    56     int size;
    57     cout<<"输入棋盘的size(大小必须是2的n次幂): ";
    58     cin>>size;
    59     int index_x,index_y;
    60     cout<<"输入特殊方格位置的坐标: ";
    61     cin>>index_x>>index_y;
    62     chessBoard ( 0,0,index_x,index_y,size );
    63     for ( int i=0; i<size; i++ )
    64     {
    65         for ( int j=0; j<size; j++ )
    66             cout<<board[i][j]<<"/t";
    67         cout<<endl;
    68     }
    69 }
    View Code

    循环赛:

     1 #include<iostream>
     2 using namespace std;
     3 void gametable(int k)
     4 {
     5     int a[100][100];
     6     int n,temp,i,j,p,t;
     7     n=2;
     8     a[1][1]=1;
     9     a[1][2]=2;
    10     a[2][1]=2;
    11     a[2][2]=1;
    12     for(t=1;t<k;t++)
    13     {
    14         temp=n;
    15         n*=2;
    16         for(i=temp+1;i<=n;i++)
    17             for(j=1;j<=temp;j++)
    18             a[i][j]=a[i-temp][j]+temp;
    19         for(i=1;i<=temp;i++)
    20             for(j=temp+1;j<=n;j++)
    21             a[i][j]=a[i][j-temp]+temp;
    22         for(i=temp+1;i<=n;i++)
    23             for(j=temp+1;j<=n;j++)
    24             a[i][j]=a[i-temp][j-temp];
    25     }
    26     for(i=1;i<=n;i++)
    27         for(j=1;j<=n;j++)
    28     {
    29         cout<<a[i][j]<<"  ";
    30         if(j==n)
    31             cout<<endl;
    32     }
    33 }
    34 int main()
    35 {
    36     int n;
    37     cin>>n;
    38     gametable(n);
    39 }
    View Code
  • 相关阅读:
    项目打包文件build.xml
    【转】常见面试之机器学习算法思想简单梳理
    【转】11位机器学习大牛最爱算法全解
    Simplify Path
    Text Justification
    Valid Number
    Substring with Concatenation of All Words
    Shortest Palindrome
    Palindrome Pairs
    Decode Ways
  • 原文地址:https://www.cnblogs.com/VectorLin/p/5194973.html
Copyright © 2011-2022 走看看