1 条题解

  • -1
    @ 2024-6-6 18:51:46

    通过观察图片我们发现除了平行于坐标轴的正方形,其他的情况,一定存在一个编号最小的行,满足行内只有一个正方形的顶点。不妨钦定这个点,找到另外的和它在一条边上的另一个顶点计算边长。那么由于正方形的四个角都是直角,所以我们只需要找到编号最小的列,满足行内只有一个正方形的顶点,就可以了。证明显然。

    接下来我们考虑怎么把这个代码写得更加优美:如果正方形边都垂直于坐标轴,那么就是找行里最右边的和列里最上面的。干脆直接特判也可以吧。

    #include <bits/stdc++.h>
    using namespace std;
    const int n = 128;
    string s[150];
    void solve()
    {
        for (int i = 1; i <= n; i++)
            cin >> s[i], s[i] = ' ' + s[i];
        for (int i = 1; i <= n; i++)
        {
            for (int j = n; j >= 1; j--)
            {
                if (!(s[i][j] ^ '0'))
                    continue;
                for (int y = 1; y <= n; y++)
                {
                    for (int x = 1; x <= n; x++)
                    {
                        if (s[x][y] ^ '0')
                            return cout << sqrt((x - i) * (x - i) + (y - j) * (y - j)) << endl, void();
                    }
                }
            }
        }
    }
    int main()
    {
        int t;
        cin >> t;
        while (t--)
            solve();
        return 0;
    }
    
    • 1

    信息

    ID
    958
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    20
    已通过
    13
    上传者