순환 경기 일정(귀속 해법)

10866 단어 递归
문제 설명:
n=2k 선수가 테니스 사이클을 치러야 한다.지금 요구를 충족시키는 경기 일정표를 설계해야 돼요.
(1) 모든 선수는 다른 n-1개 선수와 한 번씩 시합해야 한다.
(2) 하루에 한 번만 경기할 수 있는 선수가 없다.
(3) 순환 경기는 모두 n-1일 진행된다.
이 요구에 따라 경기 일정을 n행과 n-1열이 있는 표로 설계할 수 있다.표의 i행과 j열에 i선수가 제j일에 만난 선수를 기입하다.

  
    
#include < iostream >
using namespace std;
#define TABLE_SIZE 8
int table[TABLE_SIZE][TABLE_SIZE];

void Creattable( int r1, int c1, int r2, int c2, int size)
{
int i,j;
int halfsize = size / 2 ;
if (size > 1 )
Creattable(
0 , 0 ,halfsize,halfsize,halfsize); //
else
table[
0 ][ 0 ] = 1 ;
for (i = 0 ;i < size;i ++ )
for (j = 0 ;j < size;j ++ )
{
// halfsize
if (i < halfsize && (j >= halfsize && j < size))
table[i][j]
= table[i][j - halfsize] + halfsize;
//
if ((i >= halfsize && i < size) && j < halfsize)
table[i][j]
= table[i - halfsize][j + halfsize];
//
if ((i >= halfsize && i < size) && (j >= halfsize && j < size))
table[i][j]
= table[i - halfsize][j - halfsize];
}
}

int main()
{
int i,j;
Creattable(
0 , 0 ,TABLE_SIZE,TABLE_SIZE,TABLE_SIZE);

for (i = 0 ;i < TABLE_SIZE;i ++ )
{
cout
<< " " << table[i][ 0 ] << " " ;
for (j = 1 ;j < TABLE_SIZE;j ++ )
cout
<< table[i][j] << " " ;
cout
<< endl;
}
return 0 ;
}

좋은 웹페이지 즐겨찾기