DAY1


T1:

由于今天主要写搜索,所以第一题还是比较容易的。题目要用广搜,这是因为它并不是一个点不断地扩散,而是由多个点向外扩散,所以要针对每一个沙包都搜一遍。

T2

  因为输入的是01矩阵,且可以交换任意行,所以应该用广搜与动态规划相结合,用动态规划来判断某两行交换后的利益是否更大,因为是最大的矩阵,所以只要算出它的面积就好了。

T3

  第三个问题有点复杂,但实际上还是可以做出来,只是对我而言做出来的程序时间复杂度过大而已。就我的水平而言,我只能写深搜,而要拿到满分则必须运用二叉树进行优化。

程序:

T1:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,m,i,j,k,l,b[1002][1002],d1[2000002],d2[2000002],
d3[2000002],head=1,tail,x,y,z,cyj[3]={-1,0,1},lxy[3]={-1,0,1};
char a[1002][1002];
int main()
{
freopen("sandcastle.in","r",stdin);
freopen("sandcastle.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%s",a[i]+1);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]=='.')
{
b[i-1][j-1]++;b[i-1][j]++;b[i-1][j+1]++;b[i][j-1]++;
b[i+1][j-1]++;b[i+1][j]++;b[i+1][j+1]++;b[i][j+1]++;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]>='1'&&a[i][j]<='9'&&b[i][j]>=a[i][j]-'0')
{
tail++;
d1[tail]=i;
d2[tail]=j;
d3[tail]=1;
a[i][j]='.';
}
while(head<=tail)
{
x=d1[head];
y=d2[head];
for(i=0;i<=2;i++)
for(j=0;j<=2;j++)
if((lxy[i]!=0||cyj[j]!=0)&&a[x+lxy[i]][y+cyj[j]]!='.'&&
x+lxy[i]>=1&&x+lxy[i]<=n&&y+cyj[j]>=1&&y+cyj[j]<=m)
{
b[x+lxy[i]][y+cyj[j]]++;
if(b[x+lxy[i]][y+cyj[j]]>=a[x+lxy[i]][y+cyj[j]]-'0')
{
tail++;
d1[tail]=x+lxy[i];
d2[tail]=y+cyj[j];
d3[tail]=d3[head]+1;
a[x+lxy[i]][y+cyj[j]]='.';
}
}
head++;
}
cout<<d3[tail]<<endl;
return 0;

}

T2:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,m,i,j,k,b[1002][1002],max1;
char a[1002][1002];
int main()
{
    freopen("matrix.in","r",stdin);
    freopen("matrix.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    scanf("%s",a[i]+1);
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
    if(a[i][j]=='1')
    b[j][i]=b[j-1][i]+1;
    for(i=1;i<=m;i++)
    {
    sort(b[i]+1,b[i]+n+1);
     for(j=n;j>=1;j--)
      max1=max(max1,b[i][j]*(n-j+1));  
}
cout<<max1<<endl;
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值