杭电1801 Annoying painting tool(贪心)

    xiaoxiao2025-08-02  15

    杭电1801 http://acm.hdu.edu.cn/showproblem.php?pid=1801

    题目大意: 给定n * m 的矩阵范围,每次可以将 r * c 的矩阵变换颜色。

    问能否变成给定的矩阵颜色,如果可以就输出需要变换的次数,否则输出-1.

     

    解题思路:贪心,每次从上到下,从左到右的改变范围内矩阵的颜色,最后与目标矩阵作比较。

    注意:输入采用的是字符串形式

    AC代码:

    #include<iostream> #include<cstring> using namespace std; int a[200][200]; int tg[200][200]; char s[200][200]; int n,m,r,c; int ans; bool jd() { for(int i = 0;i < n;i++) { for(int j = 0;j < m ;j++) { if(a[i][j] != tg[i][j]) return false; } } return true; } void change() { for(int i = 0; i < n;i++) { for(int j = 0; j < m; j++) { if(i + r<= n&& j + c <=m && a[i][j] != tg[i][j]) { for(int k = i;k < i + r;k++) { for(int p = j; p < j + c;p++) { if(a[k][p]) a[k][p] = 0; else a[k][p] = 1; } } ans++; } } } } void ppp() { for(int i = 0;i < n;i++) { for(int j = 0;j < m;j++) { cout << a[i][j]; }cout << endl; } } int main() { while(cin >> n >> m >> r >> c) { if(n == 0 && m == 0 && r == 0 && c == 0) return 0; memset(a,0,sizeof a); memset(tg,0,sizeof tg); memset(s,0,sizeof s); ans = 0; for(int i = 0;i < n ;i++) { cin >> s[i]; for(int j = 0; j < m;j++) { tg[i][j] = s[i][j] - '0'; } } change(); //ppp(); if(jd()) cout << ans << endl; else cout << -1 << endl; } return 0; }

     

    最新回复(0)