Divida e conquiste exercícios de estratégia para design e análise de algoritmo (parte 2)

Divida e conquiste a estratégia para resolver o problema seis: problema de cronograma de rodízio

Descrição do Problema

Supondo que n = 2 ^ k jogadores precisem jogar um round robin, crie uma programação de jogo que atenda aos seguintes requisitos:

  • Cada jogador deve competir com n-1 outros jogadores uma vez cada
  • Cada jogador só pode competir uma vez por dia
  • Um total de n-1 dias no round robin

Exemplos de 8 jogadores são os seguintes:
Insira a descrição da imagem aqui

analise de problemas

Pode-se analisar a partir da imagem de exemplo que este cronograma pode ser gerado por cópia diagonal na menor unidade, por favor, assista a imagem de demonstração que fiz:
Insira a descrição da imagem aqui

Implementação de algoritmo

#include <iostream>
#include <cmath>
#include <algorithm>

#define N 100
using namespace std;
//存放日程表
int schedule[N][N];
//拷贝方块
void copyBox(int,int,int,int,int);
//生成循环赛日程表
void generateRRS(int);
int main()
{
    
    
    int n;
    cout<<"请输入参加人数:";
    cin>>n;
    generateRRS(n);
    for(int i=0;i<n;i++){
    
    
        for(int j=0;j<n;j++){
    
    
            cout<<schedule[i][j]<<"\t";
        }
        cout<<"\n\n";
    }
    return 0;
}
/*
    拷贝方块实现
    toi,toj为拷贝到的位置的左上角在二维数组中的位置
    fromi,fromj为原始的位置的左上角在二维数组中的位置
    size为拷贝方块的边长
*/
void copyBox(int toi,int toj,int fromi,int fromj,int size){
    
    
    for(int i=0;i<size;i++)
        for(int j=0;j<size;j++)
            schedule[toi+i][toj+j] = schedule[fromi+i][fromj+j];
}
/*
    生成循环赛日程表
    n=2^k,选手个数,参数错误则提示并结束程序
*/
void generateRRS(int n){
    
    

    double temp = log(n)/log(2);
    if(temp != (int)temp || temp == 0){
    
    
        cout<<"函数参数异常!";
        exit(0);
    }

    for(int i=0;i<n;i++)    //初始化第一行
		schedule[0][i]=i+1;

    for(int size=1;size<n;size*=2)
 		for(int i=0;i<n;i+=2*size)	{
    
    
			copyBox(size,size+i,0,i,size);     //左上角拷贝到右下角
			copyBox(size,i,0,size+i,size);     //右上交角拷贝到左下角
		}

}

Divida e conquiste estratégia para resolver o problema sete: cobertura especial do conselho

Descrição do Problema

  Em um tabuleiro de xadrez composto por 2k × 2k casas, há exatamente uma casa diferente das outras, essa casa é chamada de casa especial e o tabuleiro é chamado de tabuleiro de xadrez especial.
  No problema da cobertura do tabuleiro de xadrez, 4 formas diferentes de dominós em forma de L, conforme mostrado na figura, devem ser usadas para cobrir todas as casas em um determinado tabuleiro de xadrez especial, exceto as casas especiais, e quaisquer dois dominós em forma de L não devem se sobrepor.
  Para um determinado tabuleiro de xadrez especial, projete um esquema de cobertura do tabuleiro de xadrez.
    Por exemplo:
    Entrada:
      2 // k, o comprimento lateral do tabuleiro é 2k
      0 1 // As coordenadas do quadrado especial (usando uma matriz 2k * 2k para representar um tabuleiro de xadrez)
    Resultado:
     2 0 3 3
     2 2 1 3
     4 1 1 5
     4 4 5 5

analise de problemas

Insira a descrição da imagem aqui
A imagem acima é uma capa quadriculada especial 4 * 4 completa. Vamos analisá-la um pouco. Se quisermos cobri-la de maneira ordenada, o problema é decompor o problema em subproblemas suficientemente pequenos, como este:
Insira a descrição da imagem aqui
porque queremos usar o mesmo código numérico para expressar, Deve ser dividido em pequenos, quando houver apenas uma caixa vazia, preencha os números correspondentes do dominó, se não for um quadrado especial.
Em uma decomposição, precisamos colocar um número em um canto especial
  ,
  adicioná-lo ao
  canto inferior direito do canto superior esquerdo, adicionar o
  canto inferior esquerdo do canto superior direito, adicionar o canto superior esquerdo do canto inferior direito, adicionar o canto superior direito do canto esquerdo inferior ,
continuar Esta estratégia ainda é usada durante a decomposição.
Insira a descrição da imagem aqui

Implementação de algoritmo

#include <iostream>
#include <cmath>
#include <algorithm>
#define N 100
using namespace std;

//棋盘
int chessboard[N][N];
//骨牌编号
int gno = 0;

//覆盖特殊棋盘函数
void putChessboard(int,int,int,int,int);

int main()
{
    
    
    //棋盘大小
    int n;
    //特殊方格行列号
    int si,sj;

    cout<<"请输入棋盘大小:";
    cin>>n;
    //检测一下n
    double temp = log(n)/log(2);
    if(temp != (int)temp || temp == 0){
    
    
        cout<<"棋盘大小异常!";
        exit(0);
    }

    cout<<"请输入特殊方格位置:";
    cin>>si>>sj;

    putChessboard(0,0,si,sj,n);

    for(int i=0;i<n;i++){
    
    
        for(int j=0;j<n;j++){
    
    
            cout<<chessboard[i][j]<<"\t";
        }
        cout<<"\n\n";
    }
    return 0;
}
/*
    覆盖特殊棋盘函数
    ti,tj 棋盘左上角的坐标
    si,sj 特殊方格的位置
    size 棋盘宽度 不符提示并退出程序
*/
void putChessboard(int ti,int tj,int si,int sj,int size){
    
    
    if(size == 1) return;
    //当前骨牌编号
    int no = ++gno;

    int mSize = size/2; // 分割棋盘

    //处理左上角棋盘
    if(si<ti+mSize && sj<tj+mSize)
        putChessboard(ti,tj,si,sj,mSize);
    else{
    
    
        chessboard[ti+mSize-1][tj+mSize-1] = no;
        putChessboard(ti,tj,ti+mSize-1,tj+mSize-1,mSize);
    }
    //处理左下角棋盘
    if(si>=ti+mSize && sj<tj+mSize)
        putChessboard(ti+mSize,tj,si,sj,mSize);
    else{
    
    
        chessboard[ti+mSize][tj+mSize-1] = no;
        putChessboard(ti+mSize,tj,ti+mSize,tj+mSize-1,mSize);
    }
    //处理右上角棋盘
    if(si<ti+mSize && sj>=tj+mSize)
        putChessboard(ti,tj+mSize,si,sj,mSize);
    else{
    
    
        chessboard[ti+mSize-1][tj+mSize] = no;
        putChessboard(ti,tj+mSize,ti+mSize-1,tj+mSize,mSize);
    }
    //处理右下角棋盘
    if(si>=ti+mSize && sj>=tj+mSize)
        putChessboard(ti+mSize,tj+mSize,si,sj,mSize);
    else{
    
    
        chessboard[ti+mSize][tj+mSize] = no;
        putChessboard(ti+mSize,tj+mSize,ti+mSize,tj+mSize,mSize);
    }
}

Recomendado por outros artigos neste blog

Divida e conquiste exercícios de estratégia para design e análise de algoritmos (on)

Divida e conquiste estratégia para design e análise de algoritmos

Projeto de algoritmo e análise de exercícios de algoritmo recursivo (parte 2)

Projeto de algoritmo e análise de exercícios de algoritmo recursivo (on)

Problema de triângulo digital no projeto e análise de algoritmos

Projeto de algoritmo e análise de ZOJ2104- Let the Balloon Rise

Projeto de algoritmo e análise de fila de prioridade e solução ZOJ1167

Acho que você gosta

Origin blog.csdn.net/L333333333/article/details/102640726
Recomendado
Clasificación