2018 Multi-University Training Contest 4

Posted hetui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018 Multi-University Training Contest 4相关的知识,希望对你有一定的参考价值。

1001:Problem A. Integers Exhibition

 

1002:Problem B. Harvest of Apples

 

1003:Problem C. Problems on a Tree

 

1004:Problem D. Nothing is Impossible

 

1005:Problem E. Matrix from Arrays

 

1007:Problem G. Depth-First Search

 

1010:Problem J. Let Sudoku Rotate

一顿模拟加搜索就可以了,加一个小小的剪枝

技术分享图片
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <string>
#include <map>
using namespace std;
int sudoku[20][20];
int raw[20][20],col[20][20];
int ans;

void init()
{
    memset(raw,0,sizeof(raw));
    memset(col,0,sizeof(col));
    ans=0x7fffff;
}


int w[20][20];
void roat(int a,int b)//顺时针旋转矩阵90度
{

     for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
            w[j][3-i]=sudoku[a+i][b+j];
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
            sudoku[a+i][b+j]=w[i][j];
}

int vis[20],tot;
bool check(int a,int b)
{
    for(int i=a;i<a+4;i++)
    {
        tot++;
        for(int j=0;j<b+4;j++)
        {
            if(vis[sudoku[i][j]]==tot) return 0;
            vis[sudoku[i][j]]=tot;
        }
    }
    for(int i=b;i<b+4;i++)
    {
        tot++;
        for(int j=0;j<a+4;j++)
        {
            if(vis[sudoku[j][i]]==tot) return 0;
            vis[sudoku[j][i]]=tot;
        }
    }
    return 1;
}

void dfs(int x,int y,int step)
{
    if(x==4)
    {
        ans=min(ans,step);
        return;
    }
    if(step>=ans)
        return;
    if(y==4) return dfs(x+1,0,step);
    for(int i=0;i<4;i++)
    {
        if(check(x*4,y*4)) dfs(x,y+1,step+i);
        roat(x*4,y*4);
    }
}

int solve(void)
{
    int i,j;
    char str[20];
    for(i=0;i<16;i++)
    {
        scanf("%s",str);
        for(j=0;j<16;j++)
        {
            if(str[j]>=0&&str[j]<=9) sudoku[i][j]=str[j]-0;
            else if(str[j]==A) sudoku[i][j]=10;
            else if(str[j]==B) sudoku[i][j]=11;
            else if(str[j]==C) sudoku[i][j]=12;
            else if(str[j]==D) sudoku[i][j]=13;
            else if(str[j]==E) sudoku[i][j]=14;
            else if(str[j]==F) sudoku[i][j]=15;
            else;
        }
    }
    tot=0;
    dfs(0,0,0);
    printf("%d
",ans);
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        init();
        solve();
    }
    return 0;
}
View Code

1011:Problem K. Expression in Memories

 

1012:Problem L. Graph Theory Homework

易证直接从1走到n是最近的,证明方法和证均值不等式一样

技术分享图片
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <string>
#include <map>
using namespace std;
int sudoku[20][20];
int raw[20][20],col[20][20];
int ans;

void init()
{
    memset(raw,0,sizeof(raw));
    memset(col,0,sizeof(col));
    ans=0x7fffff;
}


int w[20][20];
void roat(int a,int b)//顺时针旋转矩阵90度
{

     for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
            w[j][3-i]=sudoku[a+i][b+j];
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
            sudoku[a+i][b+j]=w[i][j];
}

int vis[20],tot;
bool check(int a,int b)
{
    for(int i=a;i<a+4;i++)
    {
        tot++;
        for(int j=0;j<b+4;j++)
        {
            if(vis[sudoku[i][j]]==tot) return 0;
            vis[sudoku[i][j]]=tot;
        }
    }
    for(int i=b;i<b+4;i++)
    {
        tot++;
        for(int j=0;j<a+4;j++)
        {
            if(vis[sudoku[j][i]]==tot) return 0;
            vis[sudoku[j][i]]=tot;
        }
    }
    return 1;
}

void dfs(int x,int y,int step)
{
    if(x==4)
    {
        ans=min(ans,step);
        return;
    }
    if(step>=ans)
        return;
    if(y==4) return dfs(x+1,0,step);
    for(int i=0;i<4;i++)
    {
        if(check(x*4,y*4)) dfs(x,y+1,step+i);
        roat(x*4,y*4);
    }
}

int solve(void)
{
    int i,j;
    char str[20];
    for(i=0;i<16;i++)
    {
        scanf("%s",str);
        for(j=0;j<16;j++)
        {
            if(str[j]>=0&&str[j]<=9) sudoku[i][j]=str[j]-0;
            else if(str[j]==A) sudoku[i][j]=10;
            else if(str[j]==B) sudoku[i][j]=11;
            else if(str[j]==C) sudoku[i][j]=12;
            else if(str[j]==D) sudoku[i][j]=13;
            else if(str[j]==E) sudoku[i][j]=14;
            else if(str[j]==F) sudoku[i][j]=15;
            else;
        }
    }
    tot=0;
    dfs(0,0,0);
    printf("%d
",ans);
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        init();
        solve();
    }
    return 0;
}
View Code

 

以上是关于2018 Multi-University Training Contest 4的主要内容,如果未能解决你的问题,请参考以下文章

2018 Multi-University Training Contest 2

2018 Multi-University Training Contest 9

2018 Multi-University Training Contest 4

2018 Multi-University Training Contest 4

2018 Multi-University Training Contest 3

2018 Multi-University Training Contest 8