设为首页 加入收藏

TOP

zoj 3810 A Volcanic Island(构造)
2015-07-20 17:43:38 来源: 作者: 【 】 浏览:1
Tags:zoj 3810 Volcanic Island 构造

题目链接:zoj 3810 A Volcanic Island

题目大意:给定n,要求用n块面积为n的拼图铺满n?n的矩阵,任意两块拼图形状不能相同(包括旋转和镜像),并且n块拼图只能有4中颜色,相邻两块拼图颜色不能相同。

解题思路:构造,n = 2,3,4时是不存在的。然后对于n >= 5的直接构造,具体看代码。注意这种构造方式构造6的时候会出现相同的拼图,所以特判。

#include 
   
     #include 
    
      #include 
     
       using namespace std; const int maxn = 105; const char s[10][10] = {"BBBBBB", "GGRGRR", "GRRGRB", "GRGGRB", "GRGRRB", "GRGBBB"}; const char c[5] = "BGRY"; int g[maxn][maxn]; void solve (int n) { memset(g, 0, sizeof(g)); for (int i = 0; i < n; i++) g[0][i] = 3; int k = (n - 1) / 2, col = 1; for (int i = 0; i < k; i++) { for (int j = 1; j <= i+1; j++) g[j][i+1] = col; for (int j = i+1; j < n; j++) g[j][i] = col; col = 3 - col; } for (int i = k; i < n; i++) { for (int j = 2; j <= i+2; j++) g[j][i+2] = col; g[i+2][i+1] = col; for (int j = i+2; j < n; j++) g[j][i] = col; col = 3 - col; } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) printf("%c", c[g[i][j]]); printf("\n"); } } int main () { int cas, n; scanf("%d", &cas); while (cas--) { scanf("%d", &n); if (n == 1) printf("B\n"); else if (n == 6) { for (int i = 0; i < 6; i++) printf("%s\n", s[i]); } else if (n >= 5) { solve(n); } else printf("No solution!\n"); } return 0; }
     
    
   
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇No to Palindromes 下一篇C++实现类String--含构造函数以及..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++中智能指针的性能 (2025-12-25 03:49:29)
·如何用智能指针实现c (2025-12-25 03:49:27)
·如何在 C 语言中管理 (2025-12-25 03:20:14)
·C语言和内存管理有什 (2025-12-25 03:20:11)
·为什么C语言从不被淘 (2025-12-25 03:20:08)