ailen

来源:互联网 发布:软件项目管理常见问题 编辑:程序博客网 时间:2024/05/29 16:12

给你一个R*C的地图
现在有一个大小为A*B的飞船需要降临在图上的某个位置
要求降落区域没有障碍物
问有多少种方案

飞船可旋转

思路比较简单
DP+暴力

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>#include<queue>#include<vector>#include<climits>#include<string>#include<cstdlib>#include<ctime>#define MOD 1000000007#define LL long longusing namespace std;int r,c,p,q,i,j,k,x,y,pic[1005][1005],dp[1005][1005],ans,a,b;int main(){    freopen("alien.in","r",stdin);    freopen("alien.out","w",stdout);    scanf("%d%d%d%d",&r,&c,&p,&q);    for(i=1;i<=p;i++)    {        scanf("%d%d",&x,&y);        pic[x][y]=1;    }    for(i=1;i<=r;i++)        for(j=1;j<=c;j++)            dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+pic[i][j];    for(i=1;i<=q;i++)    {        ans=0;        scanf("%d%d",&a,&b);        for(j=1;j<=r;j++)            for(k=1;k<=c;k++)            {                if((j-a>=0)&&(k-b>=0))                {                    x=dp[j][k]-dp[j-a][k]-dp[j][k-b]+dp[j-a][k-b];                    if(!x) ans++;                   }                if(a!=b)                {                       if((j-b>=0)&&(k-a>=0))                    {                        x=dp[j][k]-dp[j-b][k]-dp[j][k-a]+dp[j-b][k-a];                        if(!x) ans++;                                       }                                   }            }        printf("%d\n",ans);    }    return 0;} 
原创粉丝点击