回收站选址题目:
回首往昔:当时觉得数据好大,不知道如何表示这么大的数据,|x|,|y|<=10^9,当时就很迷......当时的代码,对于数据大的检测点根本通不过。
于是就写出了这样的代码:
#include<cstdio> #include<iostream> using namespace std; #define M 1010 int main(){ int c; long long p=0,q=0,r=0,s=0,t=0; scanf("%d",&c); long long m[M],n[M]; bool a[M][M] ={false}; for(long long i=0;i<c;i++){ scanf("%lld%lld",&m[i],&n[i]); a[m[i]][n[i]]=true; } for(long long i=0;i<M;i++) { for(long long j=0;j<M;j++){ if(a[i][j]){ if(a[i+1][j]&&a[i-1][j]&&a[i][j+1]&&a[i][j-1]){ if(a[i+1][j-1]&&a[i-1][j-1]&&a[i-1][j+1]&&a[i+1][j+1]) t++; else if((a[i+1][j-1]&&a[i-1][j-1]&&a[i-1][j+1])||(a[i+1][j-1]&&a[i-1][j-1]&&a[i+1][j+1])||(a[i+1][j-1]&&a[i-1][j+1]&&a[i+1][j+1])||(a[i-1][j-1]&&a[i-1][j+1]&&a[i+1][j+1])) s++; else if((a[i+1][j-1]&&a[i-1][j-1])||(a[i+1][j-1]&&a[i-1][j+1])||(a[i+1][j-1]&&a[i+1][j+1])||(a[i-1][j-1]&&a[i-1][j+1])||(a[i-1][j+1]&&a[i+1][j+1])||(a[i-1][j-1]&&a[i+1][j+1])) r++; else q++; } } } } printf("%lld %lld %lld %lld %lld",p,q,r,s,t); }
当时只知道用二维数组,不知道如何才能表示这样的数字,明知道二维数组不可行,却只能用它......其他的方法一时之间我也想不到,考试时间有限.....
现在的思路:可以利用结构体,只利用一维数组就可以执行啦。(当时也有想到,但是奈何不知道如何用。。。。),对于之前的代码数据根本可以不用long long
一般的数据范围 请移步:https://www.cnblogs.com/miao-xixixi/p/12503270.html
现在的代码:
#include<iostream> #include<cstring> using namespace std; int n; struct kk{ int x,y; }a[1000]; bool f(int p,int q){ for(int i=0;i<n;i++) if(a[i].x==p&&a[i].y==q) return true; return false; } //用来检测该点有没有垃圾,若有垃圾,则遍历的时候发现这个点存在,妙哇~ bool count(kk t){ if(f(t.x-1,t.y)&&f(t.x+1,t.y)&&(f(t.x,t.y+1))&&f(t.x,t.y-1)) return true; return false; } //用来检测该点的上下左右有没有垃圾 int main(){ int c[5]; memset(c,0,sizeof(c)); int sum=0; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y); // cout<<c[0]<<endl; for(int i=0;i<n;i++){ if(count(a[i])){ if(f(a[i].x-1,a[i].y-1)) sum++; if(f(a[i].x-1,a[i].y+1)) sum++; if(f(a[i].x+1,a[i].y-1)) sum++; if(f(a[i].x+1,a[i].y+1)) sum++; c[sum]++; sum=0; } } for(int i=0;i<5;i++) printf("%d ",c[i]); return 0; }