Codeforces 432E Square Tiling(结构体+贪婪)
2015-07-20 20:18
246 查看
题目连接:Codeforces 432E Square Tiling
题目大意:给出一个n∗m的矩阵,要求对该矩阵进行上色,用大写字母。可是每次上色的区域必须是正方形。不求相邻的上色区域不能有同样的颜色,求字典序最小的方案(字典序比較,从左至右,从上到下)解题思路:用贪心的思想去构造矩阵。由于字典序的优先级为左至右,以及上到下,所以我们每次对于一个未上色点x。y,考虑最少要放到的长度p就可以。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 105; const int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; int n, m, g ; void draw(int x, int y, int k, int sign) { for (int i = 0; i < k; i++) { for (int j = 0; j < k; j++) g[x+i][y+j] = sign; } } int get(int x, int y) { int v[15]; memset(v, 0, sizeof(v)); for (int i = 0; i < 4; i++) { int p = x + dir[i][0]; int q = y + dir[i][1]; v[g[p][q]] = 1; } for (int i = 1; i <= 10; i++) if (v[i] == 0) return i; return 0; } void solve (int x, int y) { if (y > m) { y = 1; x++; } if (x > n) return ; if (g[x][y]) { solve(x, y+1); return; } int sign = get(x, y); int p = 1; while (true) { if (p + x > n || p + y > m) break; if (g[x][y+p]) break; int tmp = get(x, y+p); if (tmp != sign) break; p++; } draw(x, y, p, sign); solve(x, y + p); } int main () { scanf("%d%d", &n, &m); memset(g, 0, sizeof(g)); solve (1, 1); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) printf("%c", 'A'+g[i][j]-1); printf("\n"); } return 0; }
相关文章推荐
- UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte sequence
- 可伸缩Web架构与分布式系统
- (七十七)地理编码与反地理编码
- 大数阶乘
- java jvm内存
- iOS开发笔记---SDWebImage分析
- javase学习之路--多态的形成以作用
- android桌面图标更换后不起效果
- HDOJ N皇后问题 2553【回溯搜索】
- (七十七)地理编码与反地理编码
- 在Python中怎么表达True
- ios 音乐播放
- alertview
- 我只是倔强的坚持
- 兄弟郊游问题
- 高性能JavaScript 达夫设备
- leetcode[144]:Binary Tree Preorder Traversal
- 黑马程序员-----自动装箱与拆箱
- Android 四大组件学习之Activity六
- 剑指off-找到数组中个数大于总数一半的数字