当日总结

牛客最大正方形
题目:
对于给定的
n
×
n
n×n 的、仅由
""
"
" 和 \texttt{ 构成的矩阵中,找到一个边长最大的正方形,使得正方形的四个顶点均为字符 \texttt{ 。
输入描述:
第一行输入一个整数
n
(
1

n

100
)
n(1≦n≦100) 代表矩阵大小。
此后
n
n 行,每行输入一个长度为
n
n 的、仅由
""
"
" 和 \texttt{ 构成的字符串代表矩阵。保证输入数据中至少存在一个满足条件的正方形。
输出描述:
输出四行,每行两个整数,代表正方形四个顶点所在的单元格。我们使用
(
i
,
j
)
(i,j) 表示网格中从上往下数第
i
i 行和从左往右数第
j
j 列的单元格,从
1
1 开始编号。
如果存在多个解决方案,您可以输出任意一个,系统会自动判定是否正确。注意,自测运行功能可能因此返回错误结果,请自行检查答案正确性。
正确代码:

include

using namespace std;
int n;
char ch[110][110];
int ans[4][2];

int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>ch[i][j];
int x1,y1,x2,y2,x3,y3,x4,y4;
double len,maxx=0;
for(x1=1;x1<=n;x1++)
for(y1=1;y1<=n;y1++)
if(ch[x1][y1]'#')
for(x2=1;x2<=n;x2++)
for(y2=1;y2<=n;y2++)
if(ch[x2][y2]
'#')
{
x3=x1+y2-y1;
y3=y1-(x2-x1);
x4=x2+y2-y1;
y4=y2-(x2-x1);
if(x3>=1&&x3<=n&&x4>=1&&x4<=n&&y3>=1&&y3<=n&&y4>=1&&y4<=n)
if(ch[x3][y3]'#'&&ch[x4][y4]'#')
{
len=(x1-x2)(x1-x2)+(y1-y2)(y1-y2);
if(len>maxx)
{
maxx=len;
ans[0][0]=x1;
ans[0][1]=y1;
ans[1][0]=x2;
ans[1][1]=y2;
ans[2][0]=x3;
ans[2][1]=y3;
ans[3][0]=x4;
ans[3][1]=y4;
}
}
}

for(int i=0;i<4;i++)
{
    for(int j=0;j<2;j++)
        cout<<ans[i][j]<<' ';
    cout<<endl;
}    
return 0;

}
思路:输入字符矩阵,只枚举正方形的两个顶点,再通过向量旋转推导出另外两个顶点,验证两个顶点符合要求,存在ans数组中,往后比较符合条件的正方形的边长,边长大的存入数组ans中,最后输出

posted @ 2026-03-21 21:58  lagranSun  阅读(5)  评论(0)    收藏  举报