题意

  • 给定一个由*和#构成的正方形矩阵,求其中以#为顶点的最大正方形,输出四个顶点坐标

思路

  • 两个点确定一个正方形,三个点确定一个长方形,枚举所有的两个#,check当前两个#构造出的另外两个顶点是否为#,通过边长比较正方形大小
  • 注意:计算几何中尽可能避免硬解方程组,多考虑向量和三角函数,本题使用三角推导另两个点最为便捷
  • 附图:

alt

AC代码

#include<bits/stdc++.h>
using namespace std;
char mp[120][120];
long long l=0;
vector<int>ans(8);
int n;
void check(int x,int y){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(mp[i][j]=='#'){
                int dx=i-x,dy=j-y;
                if(x+dy<=0||x+dy>n||y-dx<=0||y-dx>n||i+dy<=0||i+dy>n||j-dx<=0||j-dx>n)continue;
                if(mp[x+dy][y-dx]=='#'&&mp[i+dy][j-dx]=='#'&&1ll*dx*dx+dy*dy>l){
                    l=dx*dx+dy*dy;
                    ans={x,y,i,j,x+dy,y-dx,i+dy,j-dx};
                }
            }
        }
    }
}
int main(){
    scanf("%d ",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            scanf("%c",&mp[i][j]);
        }
        getchar();
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(mp[i][j]=='#'){
                check(i,j);
            }
        }
    }
    for(int i=0;i<8;i++){
        printf("%d ",ans[i]);
        if(i%2) printf("\n");
    }
    return 0;
}

随想

  • 数学感觉还是很差,对向量的应用很难一下理解,听到雨巨用的对角线,推了半天式子还是对不上给的代码,最后发现使用的是相邻两点,难以评价-_-