NOIP2018原创模拟赛DAY1 PION贪吃蛇

你以为我把这道题写了吗

不可能的,国服被卡王连最短路都写挂了,这道题现在都没写出来

其实考场上是写了的,但是挂了,最后到点了,心态炸裂,四千多b呀(流泪)

一起打比赛的哥们在我写题的时候打了三把炉石,还写了一篇作文(

然后你问我没调出来些什么博客,我表示

“一家人就是要整整齐齐”

下面附上我连样例都过不了的代码(仅供娱乐,抄袭OK):

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
inline int rd()
{
    int x=0,f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0';
    return x*f;
}
inline void write(int x)
{
     if(x<0) putchar('-'),x=-x;
     if(x>9) write(x/10);
     putchar(x%10+'0');
}
int n,m,k;
int cnt=0;
char map[1006][1006];
struct node{
    int s1,s2;
}head[100006];
char s[1006][1006];
struct skr{
    int len,c;
}ans[100006];
bool cmp(const skr x,const skr y){
    if(x.len==y.len) return x.c<y.c;
    return x.len>y.len;
}
void die(int x,int y){
    if(map[x-1][y]=='#'){
        map[x-1][y]='&';
        die(x-1,y);
    }
    if(map[x][y-1]=='#'){
        map[x][y-1]='&';
        die(x,y-1);
    }
    if(map[x+1][y]=='#'){
        map[x+1][y]='&';
        die(x+1,y);
    }
    if(map[x][y+1]=='#'){
        map[x][y+1]='&';
        die(x,y+1);
    }
    return ;
}
int vis[206][206];
int num=0;
int getl(int x,int y){
    vis[x][y]=1;
    num++;
    if(!vis[x-1][y]&&map[x-1][y]=='#') getl(x-1,y);
    if(!vis[x][y-1]&&map[x][y-1]=='#') getl(x,y-1);
    if(!vis[x+1][y]&&map[x+1][y]=='#') getl(x+1,y);
    if(!vis[x][y+1]&&map[x][y+1]=='#') getl(x,y+1);
    return num;
}
void move(int x,int y,int lx,int ly){
    vis[x][y]=1;
    if(lx==x-1){
        if(map[x+1][y]!='#'&&map[x][y-1]!='#'&&map[x][y+1]!='#'){
            map[x][y]='.';
            return ;
        }
    }
    if(lx==x+1){
        if(map[x-1][y]!='#'&&map[x][y-1]!='#'&&map[x][y+1]!='#'){
            map[x][y]='.';
            return ;
        }
    }
    if(ly==y-1){
        if(map[x+1][y]!='#'&&map[x-1][y]!='#'&&map[x][y+1]!='#'){
            map[x][y]='.';
            return ;
        }
    }
    if(ly==y+1){
        if(map[x+1][y]!='#'&&map[x][y-1]!='#'&&map[x-1][y]!='#'){
            map[x][y]='.';
            return ;
        }
    }
    if(map[x-1][y]=='#'&&!vis[x-1][y]){
        move(x-1,y,x,y);
    }
    if(map[x][y-1]=='#'&&!vis[x][y-1]){
        move(x,y-1,x,y);
    }
    if(map[x+1][y]=='#'&&!vis[x+1][y]){
        move(x+1,y,x,y);
    }
    if(map[x][y+1]=='#'&&!vis[x][y+1]){
        move(x,y+1,x,y);
    }
    return ;
}
void solve(char x,int y,int z){
    memset(vis,0,sizeof(vis));
    int i=head[y].s1,j=head[y].s2;
    if(x=='W'){
        if(map[i-1][j]=='&'){
            map[i-1][j]='@';
            ans[z].len++;
            map[i][j]='#';
        }
        if(map[i-1][j]=='#'||map[i-1][j]=='@'||i-1<1){
            map[i][j]='&';
            ans[z].len=0;
            die(i,j);
        }
        if(map[i-1][j]=='.'){
            map[i-1][j]='@';
            map[i][j]='#';
            move(i,j,i-1,j);
        }
    }
    if(x=='S'){
        if(map[i+1][j]=='&'){
            ans[z].len++;
            map[i+1][j]='@';
            map[i][j]='#';
        }
        if(map[i+1][j]=='#'||map[i-1][j]=='@'||i+1>n){
            map[i][j]='&';
            ans[z].len=0;
            die(i,j);
        }
        if(map[i+1][j]=='.'){
            map[i+1][j]='@';
            map[i][j]='#';
            move(i,j,i+1,j);
        }
    }
    if(x=='A'){
        if(map[i][j-1]=='&'){
            ans[z].len++;
            map[i][j-1]='@';
            map[i][j]='#';
        }
        if(map[i][j-1]=='#'||map[i][j-1]=='@'||j-1<1){
            map[i][j]='&';
            ans[z].len=0;
            die(i,j);
        }
        if(map[i][j-1]=='.'){
            map[i][j-1]='@';
            map[i][j]='#';
            move(i,j,i,j-1);
        }
    }
    if(x=='D'){
        if(map[i][j+1]=='&'){
            ans[z].len++;
            map[i][j+1]='@';
            map[i][j]='#';
        }
        if(map[i][j+1]=='#'||map[i][j+1]=='@'||j+1>m){
            map[i][j]='&';
            ans[z].len=0;
            die(i,j);
        }
        if(map[i][j+1]=='.'){
            map[i][j+1]='@';
            map[i][j]='#';
            move(i,j,i,j+1);
        }
    }
    return ;
}
int main()
{
    /*
    如果你没有看完上面的话,还想把代码拷走,你可真是倒了八辈子血霉了 
    手动滑稽 
    */
    n=rd();
    m=rd();
    k=rd();
    for(int i=1;i<=n;i++){
        /*for(int j=1;j<=m;j++){
            map[i][j]=getchar();
            if(map[i][j]=='@') cnt++;
        }*/
        scanf("%s",map[i]+1);
        for(int j=1;j<=m;j++){
            if(map[i][j]=='@'){
                cnt++;
                head[cnt].s1=i;
                head[cnt].s2=j;
                ans[cnt].c=cnt;
            }
        }
    }
    for(int i=1;i<=cnt;i++){
        num=0;
        memset(vis,0,sizeof(vis));
        ans[i].len=getl(head[i].s1,head[i].s2);
    }
    for(int i=1;i<=cnt;i++){
        scanf("%s",s[i]+1);
    }
    for(int i=1;i<=k;i++){
        for(int j=1;j<=cnt;j++){
            char h=s[j][i];
            solve(h,j,j);
            /*cout<<endl;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                   cout<<map[i][j];
                 }
                 cout<<endl;
            }*/
        }
        
    }
    sort(ans+1,ans+cnt+1,cmp);
    for(int i=1;i<=cnt;i++){
        printf("%d %d\n",ans[i].len,ans[i].c);
    }
    int sum=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(map[i][j]=='&'){
                sum++;
            }
        }
    }
    printf("%d",sum);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/WWHHTT/p/9696435.html