大厂笔试题
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
1.7 KiB

  1. // #include <iostream>
  2. // #include <string>
  3. // using namespace std;
  4. // int main() {
  5. // string s;
  6. // getline(cin, s);
  7. // for (size_t i = 0; i < s.length() - 1; ++i) {
  8. // if (s[i] == 'm' || s[i] == 'M') {
  9. // if (s[i + 1] == 't' || s[i + 1] == 'T') {
  10. // s.replace(i, 2, "$$");
  11. // i++;
  12. // }
  13. // }
  14. // }
  15. // cout << s << endl;
  16. // return 0;
  17. // }
  18. #include <iostream>
  19. #include <cstring>
  20. #include <algorithm>
  21. using namespace std;
  22. const int N = 1000;
  23. int n;
  24. char str[N][N];
  25. int m[N][N], s[N][N];
  26. int ans[N];
  27. int GetPreSub(int x1, int y1, int x2, int y2) {
  28. return s[x2 + 1][y2 + 1] - s[x1][y2 + 1] - s[x2 + 1][y1] + s[x1][y1];
  29. }
  30. int main() {
  31. cin >> n;
  32. for (int i = 0; i < n; i++) cin >> str[i];
  33. //数据存储
  34. for (int i = 0; i < n; i ++) {
  35. for (int j = 0; j < n; j ++) {
  36. if (str[i][j] == '1') {
  37. m[i + 1][j + 1] = 1;
  38. } else {
  39. m[i + 1][j + 1] = 0;
  40. }
  41. }
  42. }
  43. // 计算前缀和
  44. for (int i = 1; i <= n; i ++) {
  45. for (int j = 1; j <= n; j ++) {
  46. s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + m[i][j];
  47. }
  48. }
  49. for (int i = 0; i < n; i ++) {
  50. for (int j = 0; j < n; j ++) {
  51. for (int k = 0; k < n; k ++) {
  52. if(i + k >= n || j + k >= n) {
  53. break;
  54. }
  55. int sub = GetPreSub(i, j, i + k, j + k);
  56. if (sub * 2 == (k + 1) * (k + 1)) {
  57. ans[k] ++;
  58. }
  59. }
  60. }
  61. }
  62. for (int i = 0; i < n; i ++) cout << ans[i] << endl;
  63. return 0;
  64. }