样列全过但是全WA
查看原帖
样列全过但是全WA
1045028
xhz123456789楼主2024/5/12 22:46
#include<bits/stdc++.h>
using namespace std;
char map_1[205][205];
int n,m,k,c,food;
struct X_Y{
    int x,y;
    inline  X_Y operator+(X_Y const & b){return {x+b.x,y+b.y};}
    inline  X_Y operator+=(X_Y const & b){return {x+=b.x,y+=b.y};}
    template<class T> inline  auto& get(T&t){return t[x][y];}
};
struct SNAKE{
    static const constexpr auto map=map_1;
    struct OPT{
        static X_Y opts[256];
        unsigned char opt[55],*p=opt;
        static inline void init(){opts['W']={-1,0},opts['S']={1,0},opts['A']={0,-1},opts['D']={0,1};}
        inline const X_Y front(){return opts[*p];}
        inline const X_Y pop(){return opts[*(p++)];}
    }opts;
    bool is_die;
    int num;
    X_Y head;
    queue<X_Y> body;
    inline void opt_1(){
        is_die=is_die|(head+opts.front()).get(map)=='#';
    }
    inline void opt_2(){
        if(is_die){
            for(food+=body.size();!body.empty();body.pop()) body.front().get(map)='&';
        }else{
            head+=opts.pop();;
            body.push(head);
            if(head.get(map)=='&') food--; else body.front().get(map)='.',body.pop(); 
            head.get(map)='#';
        }
    }
    static inline bool cmp(SNAKE const & a,SNAKE const & b){return a.body.size()!=b.body.size()?a.body.size()>b.body.size():a.num<b.num;}
}snake[25];
X_Y SNAKE::OPT::opts[256]={};
bool is_search[205][205];
void dfs (X_Y p,queue<X_Y>&q){
    for(auto i:{p+X_Y{0,1},p+X_Y{0,-1},p+X_Y{1,0},p+X_Y{-1,0}})if((!i.get(is_search))&&i.get(map_1)=='#')i.get(is_search)=true,dfs(i,q);
    q.push(p);
}
int main(){
    SNAKE::OPT::init();
    cin>>n>>m>>k;
    for(int i=0;i<=n;i++) cin.getline(map_1[i]+1,m+1);
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){
        if(map_1[i][j]=='&')food++;
        else if(map_1[i][j]=='@'){
            dfs(snake[c].head={i,j},snake[c].body);
            snake[c].num=c+1;
            c++;
        }
    }
    for(int i=0;i<c;i++)snake[i].head.get(map_1)='#';
    if(k)for(int i=0;i<c;i++)cin>>snake[i].opts.opt;
    for(int i=0;i<=n;i++) map_1[i][0]=map_1[i][m+1]='#';
    for(int i=0;i<=m;i++) map_1[0][i]=map_1[n+1][i]='#';
    for(int i=0;i<k;i++){
        for(int j=0;j<c;j++) snake[j].opt_1();
        for(int j=0;j<c;j++) snake[j].opt_2();
    }
    sort(snake,snake+c,SNAKE::cmp);
    for(int i=0;i<c;i++)cout<<snake[i].body.size()<<" "<<snake[i].num<<"\n";
    cout<<food;
    return 0;
}
2024/5/12 22:46
加载中...