Codeforces 432E Square Tiling(结构体+贪婪)
生活随笔
收集整理的這篇文章主要介紹了
Codeforces 432E Square Tiling(结构体+贪婪)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目連接: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[N][N];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; }版權聲明:本文博客原創文章。博客,未經同意,不得轉載。
總結
以上是生活随笔為你收集整理的Codeforces 432E Square Tiling(结构体+贪婪)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决SQL server2005数据库死
- 下一篇: Mac下修改环境变量