csp 2019-12-2 回收站选址

回收站选址题目:

 回首往昔:当时觉得数据好大,不知道如何表示这么大的数据,|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\n%lld\n%lld\n%lld\n%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\n",c[i]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/miao-xixixi/p/12502988.html