U523966 T560456<神之一手>题解😊
  • 板块学术版
  • 楼主yangkeru
  • 当前回复5
  • 已保存回复5
  • 发布时间2025/1/12 21:06
  • 上次更新2025/1/13 10:36:43
查看原帖
U523966 T560456<神之一手>题解😊
1428490
yangkeru楼主2025/1/12 21:06
#include <bits/stdc++.h>
using namespace std;
int n, m;
char g[55][55];
// 从下标为 1 开始,分别记录 8 个方向的下标变化。
// 左上、上、右上、左、右、左下、下、右下。
int dx[] = {0, -1, -1, -1, 0, 0, 1, 1, 1};
int dy[] = {0, -1, 0, 1, -1, 1, -1, 0, 1};
int main()
{
    cin >> n >> m;
    // 为了避免减 2 造成数组越界,下标从 2 开始输入 
    for (int i = 2; i <= n + 1; i++)
        for (int j = 2; j <= m + 1; j++)
            cin >> g[i][j];
    int ans = 0;
    for (int i = 2; i <= n + 1; i++)
        for (int j = 2; j <= m + 1; j++)
        {
            if (g[i][j] == '#')
                continue; 
            bool flag = false;
            // 作为端点的八个方向
            for (int k = 1; k <= 8; k++)
            {
                int x = i + dx[k];
                int y = j + dy[k];
                int xx = i + 2 * dx[k];
                int yy = j + 2 * dy[k];
                if (g[x][y] == '#' && g[xx][yy] == '#')
                {
                    flag = true;
                    break;
                }
            }
            if (flag)
            {
                ans++;
                continue;
            }
            // 作为中间点的四个方向
            for (int k = 1; k <= 4; k++)
            {
              // 两个棋子方向正相反 
                int x = i + dx[k];
                int y = j + dy[k];
                int xx = i - dx[k];
                int yy = j - dy[k];
                if (g[x][y] == '#' && g[xx][yy] == '#')
                {
                    flag = true;
                    break;
                }
            }
            if (flag)
                ans++;
        }
    cout << ans << "\n";
    return 0;
}
2025/1/12 21:06
加载中...