社区讨论
U523966 T560456<神之一手>题解😊
学术版参与者 5已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @m5tmrphz
- 此快照首次捕获于
- 2025/01/12 21:08 去年
- 此快照最后确认于
- 2025/01/13 10:36 去年
CPP
#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;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...