最大正方形
由于数据范围很小,可以开多重循环。
一开始没有思路,后来发现只要知道左上角和右下角的点就可以确定一个正方形,枚举即可。(中点+全等)
注意判断边长大小的时候采用sqrt会有精度的问题,需要直接用平方避免误差。
#include<bits/stdc++.h>
#define endl '\n'
#define pii pair<int,int>
using namespace std;
const int maxn = 103;
char a[maxn][maxn];
void solve()
{
int xa,xb,xc,xd;
int ya,yb,yc,yd;
int n; cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int x=i+1;x<n;x++)
{
for(int y=j+1;y<n;y++)
{
if(a[i][j]=='#'&&a[x][y]=='#')
{
double midx=(i+x)/2.0;
double midy=(j+y)/2.0;
double detx=x-midx;
double dety=y-midy;
int ax=midx+dety;
int ay=midy-detx;
int bx=midx-dety;
int by=midy+detx;
if(ax!=midx+dety||ay!=midy-detx||bx!=midx-dety||by!=midy+detx)
continue;
if(ax>=0&&ay>=0&&ax<n&&ay<n&&bx>=0&&bx<n&&by>=0&&by<n)
{
if(a[ax][ay]=='#'&&a[bx][by]=='#')
{
int temp=(x-ax)*(x-ax)+(y-ay)*(y-ay); // 不要用sqrt
if(temp>ans)
{
ans=temp;
xa=i,ya=j;
xb=bx,yb=by;
xc=ax,yc=ay;
xd=x,yd=y;
}
}
}
}
}
}
}
}
cout<<xa+1<<" "<<ya+1<<endl;
cout<<xc+1<<" "<<yc+1<<endl;
cout<<xb+1<<" "<<yb+1<<endl;
cout<<xd+1<<" "<<yd+1<<endl;
return ;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; T=1;
while(T--) solve();
return 0;
}
回文日期
首先确定枚举对象,由于回文数的性质,我们可以枚举年份来推出月份和日期,但这样枚举需要处理的细节较多也很麻烦。
#include<bits/stdc++.h>
#define endl '\n'
#define pii pair<int,int>
using namespace std;
bool pd(int year)
{
if(year%4==0&&year%100!=0) return true;
else if(year%400==0) return true;
else return false;
}
int month1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; // 平年
int month2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; // 闰年
void solve()
{
string l,r;
cin>>l>>r;
int start=(l[0]-'0')*1000+(l[1]-'0')*100+(l[2]-'0')*10+(l[3]-'0');
int end=(r[0]-'0')*1000+(r[1]-'0')*100+(r[2]-'0')*10+(r[3]-'0');
int cnt=0;
int lmonth=(l[4]-'0')*10+(r[5]-'0');
int lday=(l[6]-'0')*10+(l[7]-'0');
int rmonth=(r[4]-'0')*10+(r[5]-'0');
int rday=(r[6]-'0')*10+(r[7]-'0');
for(int i=start;i<=end;i++)
{
int temp=i;
int month=0,day=0;
month+=temp%10; temp/=10; month*=10;
month+=temp%10; temp/=10;
day+=temp%10; temp/=10; day*=10;
day+=temp;
// cout<<month<<" "<<day<<endl;
if(i==start)
{
if(month<lmonth)
continue;
if(month==lmonth&&day<lday)
continue;
}
if(i==end)
{
if(month>rmonth)
continue;
if(month==rmonth&&day>rday)
continue;
}
bool sig=pd(i);
if(sig) // 闰年
{
if(month<=12&&month>0&&day<=month2[month]&&day>0) cnt++;
}
else
{
if(month<=12&&month>0&&day<=month1[month]&&day>0) cnt++;
}
}
cout<<cnt<<endl;
return ;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; T=1;
while(T--) solve();
return 0;
}
实际上,我们可以枚举月份和日期来反推年份,可以发现2月有29天时对应的回文数是92200229,由于9220是闰年,因此不需要判断年份是不是闰年,将2月设置成29天枚举即可。
#include<bits/stdc++.h>
#define endl '\n'
#define pii pair<int,int>
using namespace std;
int day[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
void solve()
{
int l,r; cin>>l>>r;
int ans=0;
for(int i=1;i<=12;i++)
{
for(int j=1;j<=day[i];j++)
{
int temp=(j%10)*1000+(j/10)*100+(i%10)*10+i/10;
temp*=10000;
temp+=i*100+j;
if(temp>=l&&temp<=r) ans++;
}
}
cout<<ans<<endl;
return ;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; T=1;
while(T--) solve();
return 0;
}