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;}