結果

問題 No.640 76本のトロンボーン
ユーザー vjudge1
提出日時 2025-08-24 12:54:58
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 2 ms / 2,000 ms
コード長 2,019 bytes
コンパイル時間 1,451 ms
コンパイル使用メモリ 166,716 KB
実行使用メモリ 7,716 KB
最終ジャッジ日時 2025-08-24 12:55:01
合計ジャッジ時間 2,343 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 15
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#define FILE(x)                   \
    freopen(x ".in", "r", stdin); \
    freopen(x ".out", "w", stdout);
using namespace std;
const int N = 80;
int n;
string s[N], t[N];
int ans;
bool flag[N][2];
bool pd[4];
int f()
{
    int res = 0;
    memset(flag, 0, sizeof flag);
    for (int i = 1; i <= n; i++)
    {
        bool ok = 0;
        for (int j = 2; j < n; j++)
        {
            if (s[i][j] == '#')
                ok = 1;
        }
        if (!ok)
        {
            if (s[i][1] != '#')
                flag[i][0] = 1;
            if (s[i][n] != '#')
                flag[i][1] = 1;
            res += (flag[i][0] || flag[i][1]);
        }
    }
    memset(pd, 0, sizeof pd);
    for (int i = 0; i < 4; i++)
    {
        int tot = 0;
        bool row = 1;
        for (int j = 1; j < n; j++)
        {
            if (s[j + (i & 2 ? 1 : 0)][i & 1 ? 1 : n] == '#')
                row = 0;
        }
        pd[i] = row;
        if (row)
            tot++;
        int p = i & 2 ? 1 : n;
        if (flag[p][0] || flag[p][1])
        {
            tot++;
        }
        for (int j = 1; j < n; j++)
        {
            if (flag[j + (i & 2 ? 1 : 0)][i & 1])
                tot++;
        }
        res = max(res, tot);
    }
    res = max(res, pd[0] + pd[1] + (flag[n][0] || flag[n][1]));
    res = max(res, pd[2] + pd[3] + (flag[1][0] || flag[1][1]));
    res = max(res, pd[0] + pd[3] + flag[1][0] + flag[n][1]);
    res = max(res, pd[1] + pd[2] + flag[1][1] + flag[n][0]);
    return res;
}
void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> s[i];
        s[i] = ' ' + s[i];
        t[i] = s[i];
    }
    ans = f();
    for (int i = 1; i <= n; i ++)
    {
        for (int j = 1; j <= n; j ++)
        {
            s[i][j] = t[j][i];
        }
    }
    cout << max(ans, f());
}
int main()
{
    //FILE("trombone");
    ios ::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int T = 1;
    while (T--)
        solve();
    return 0;
}
0