https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=233
参考了刘汝佳的算法,写得太妙了。
因为最多是1024块,所以每行每列最多是32,利用先序遍历,一旦是'p'时,就访问第1块,如果第一块内还有细分,则继续递归下去。然后继续依次访问第2,3,4块空间。
1 #include2 #include 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 }