1. 程式人生 > >洛谷P2102 地磚鋪設(貪心)

洛谷P2102 地磚鋪設(貪心)

題解:真的是訓練程度太不飽和。 參考了大佬的題解。我一開始也是想著不論n>mn>m還是n<mn <m,都可以用BCBC...BCBC...給分隔開,然後繼續放AA。實際上是錯的。。。正解應該是貪心擴充套件,直到不滿足為止(點被佔用或者達到邊界或者無法塗色)。

#include<bits/stdc++.h>

using namespace std;
int s[101][101];

int you(int x,int y)
{
    int cur = 0;
    if(s[x - 1][
y]) cur |= (1<<s[x - 1][y]); if(s[x][y - 1]) cur |= (1<<s[x][y - 1]); if(s[x][y + 1]) cur |= (1<<s[x][y + 1]); for(int i = 1; ; ++i) if(!(cur & (1 << i))) return i; } int main() { #ifndef ONLINE_JUDGE freopen("input.in","r",stdin); #endif int n,m; cin>>
n>>m; for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { if(s[i][j]) continue; int love = you(i,j), x = i + 1, y = j + 1; while("QAQ") { if(s[i][y] || s[x][j] || x > n || y > m) break; int shit =
you(i,y); if(shit != love) break; x++,y++; } for(int a = i; a < x; ++a) { for(int b = j; b < y; ++b) { s[a][b] = love; } } } } for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { putchar(s[i][j] + 'A' - 1); } puts(""); } return 0; }