zoj3810——A Volcanic Island (四色定理)

6 篇文章 0 订阅
5 篇文章 0 订阅

The 2014 ACM-ICPC Asia Mudanjiang Regional First Round - B
A Volcanic Island
题意: 用 n 块面积为 n 的图块拼满一个 n*n 的矩阵图,并且 n 块图只有四种颜色,相邻的图块不能有相同的颜色,任意的两块不能有相同的形状,包括旋转,对称;

注意当n为6 的时候会有相同的块,所以要特判一下;


代码:

#include 
     
     
      
        
#include 
      
      
       
         
  
const int MAXN = 117;  
char mm[MAXN][MAXN];  
char col[2];  
int n;  
  
void solve()  
{  
    for(int i = 0; i < n; i++)  
    {  
        for(int j = 0; j < n; j++)  
        {  
            mm[i][j] = 'B';  
        }  
    }  
    for(int i = 0; i < n; i++)  
        mm[0][i] = 'Y';  
    for(int i = 0; i < (n-1)/2; i++)  
    {  
        char c = col[i%2];  
        for(int j = i+1; j < n; j++)  
        {  
            mm[j][i] = c;  
        }  
        for(int j = 1; j <= i+1; j++)  
        {  
            mm[j][i+1] = c;  
        }  
    }  
    for(int i = (n-1)/2; i < n-1; i++)  
    {  
        char c = col[i%2];  
        for(int j = i+2; j < n; j++)  
        {  
            mm[j][i] = c;  
        }  
        mm[i+2][i+1] = c;  
        for(int j = 2; j <= i+2; j++)  
        {  
            mm[j][i+2] = c;  
        }  
    }  
    for(int i = 0; i < n; i++)  
    {  
        for(int j = 0; j < n; j++)  
        {  
            printf("%c",mm[i][j]);  
        }  
        printf("\n");  
    }  
}  
  
int main()  
{  
    col[0] = 'G';  
    col[1] = 'R';  
    int t;  
    scanf("%d",&t);  
    while(t--)  
    {  
        scanf("%d",&n);  
        if(n == 1)  
            printf("Y\n");  
        else if(n <= 4)  
            printf("No solution!\n");  
        else if(n == 6)//特判  
        {  
            printf("YYYYYY\n");  
            printf("GGRGRR\n");  
            printf("GRRGRB\n");  
            printf("GRGGRB\n");  
            printf("GRGRRB\n");  
            printf("GRGBBB\n");  
        }  
        else  
        {  
            solve();  
        }  
    }  
    return 0;  
}  

      
      
     
     
个人理解:首先,我们必须要找出一个方法来保证图形的不一致性,笔者用的方法是

     也就是横线部分有0个,2个,3个,这样竖线部分可以任意分配,中间绿色的最特别,他隔开了两个组织,也就是说对于这样一个规则图形,三色is OK !
但是,我们来看 6*6 的情形
这种横线部分为三的重复了,这就是基数太小的后果...
这道题基本上就是这样了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值