棋盘覆盖问题&循环赛日程表问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了棋盘覆盖问题&循环赛日程表问题相关的知识,希望对你有一定的参考价值。
---恢复内容开始---
简单的分治,曾经看了好久想了好久也不会的随着时间变成最简单的题,由于刘汝佳书上说的不多,网上找到的又总是一个湖南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 }
循环赛:
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 }
以上是关于棋盘覆盖问题&循环赛日程表问题的主要内容,如果未能解决你的问题,请参考以下文章