https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=233
参考了刘汝佳的算法,写得太妙了。
因为最多是1024块,所以每行每列最多是32,利用先序遍历,一旦是'p'时,就访问第1块,如果第一块内还有细分,则继续递归下去。然后继续依次访问第2,3,4块空间。
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 const int len = 32; 6 const int maxn = 1024 + 10; 7 char s[maxn]; 8 char buf[maxn][maxn]; 9 int number; 10 11 void solve(char *s, int &p,int r,int c,int w) 12 { 13 char q = s[p++]; 14 if (q == 'p') 15 { 16 solve(s, p, r, c + w / 2, w / 2); 17 solve(s, p, r, c, w / 2); 18 solve(s, p, r + w / 2, c, w / 2); 19 solve(s, p, r + w / 2, c + w / 2, w / 2); 20 } 21 else if (q=='f') 22 for (int i = r; i < r + w;i++) 23 for (int j = c; j < c + w;j++) 24 if (buf[i][j] == 0) 25 { 26 buf[i][j] = 1; 27 number++; 28 } 29 } 30 31 int main() 32 { 33 int t; 34 cin >> t; 35 while (t--) 36 { 37 memset(buf, 0, sizeof(buf)); 38 number = 0; 39 cin >> s; 40 int p = 0; 41 solve(s,p,0,0,len); 42 cin >> s; 43 p = 0; 44 solve(s,p,0,0,len); 45 cout << "There are " << number << " black pixels." << endl; 46 } 47 return 0; 48 }