【交互题】

【交互题】

输入 的数据是 根据输出的数据决定

语法格式

  • 【推荐使用】若使用scanf printf
    在每次输出后加一句fflush(stdout)

  • 若使用cin cout
    #define endl '\n'的情况下
    不要关闭同步流!
    在每次输出后加一句fflush(stdout)

常见方法

【题目积累】

【构造】Snake

https://qoj.ac/contest/3588/problem/17759

贪吃蛇结论

题目大意

贪吃蛇规则,每次给出目标点,要到达目标点吃掉果子
执行\(n \times m-1\)

思路

1fa61251833022eea0348b5420ad89a0

代码

注意(1,1)和(2,2)的处理

int n,m,stx,sty;
void solve(){
    cin>>n>>m>>stx>>sty;
    vector<vector<char>> s(n+1,vector<char>(m+1,'%'));
    //int cnt=0;
    int mode=0;
    auto query=[&](int sx,int sy,int mx,int my,bool isji)->void{
        int nx=sx,ny=sy;
        string ans;
        if(isji && mx==1 && my==1){
            if(sx==2 && sy==2){
                ans+='U';
                nx--;
            }
            s[2][1]='U';
            s[2][2]='R';
            s[2][2]='%';
        }
        if(isji && mx==2 && my==2){
            if(sx==1 && sy==1){
                ans+='R';
                ny++;
            }
            s[2][1]='R';
            s[2][2]='U';
            s[1][1]='%';
        }
        while(nx!=mx || ny!=my){
            if(s[nx][ny]=='U'){
                ans+='U';
                nx--;
            }
            else if(s[nx][ny]=='D'){
                ans+='D';
                nx++;
            }
            else if(s[nx][ny]=='L'){
                ans+='L';
                ny--;
            }
            else{
                ans+='R';
                ny++;
            }
        }
        cout<<ans<<endl;
        cout.flush();
        
    };
    if(n%2==0 || m%2==0){
        if(n%2==0){//n偶数
            for(int i=1;i<=n;i++){
                s[i][1]='D';
            }
            s[n][1]='R';
            for(int i=1;i<=n;i+=2){
                for(int j=3;j<=m;j++){
                    s[i][j]='L';
                }
            }
            for(int i=2;i<=n;i+=2){
                for(int j=2;j<=m-1;j++){
                    s[i][j]='R';
                }
            }
            for(int i=2;i<=n;i++){
                if(i%2==0){
                    s[i][m]='U';
                }
                else{
                    s[i][2]='U';
                }
            }
            if(m>=2) s[1][2]='L';
        }
        else{
        	
            for(int i=1;i<=m;i++){
                s[1][i]='R';
            }
            s[1][m]='D';
            for(int i=1;i<=m;i+=2){
                for(int j=3;j<=n;j++){
                    s[j][i]='U';
                }
            }
            for(int i=2;i<=m;i+=2){
                for(int j=2;j<=n-1;j++){
                    s[j][i]='D';
                }
            }
            for(int i=2;i<=m;i++){
                if(i%2==0){
                    s[n][i]='L';
                }
                else{
                    s[2][i]='L';
                }
            }
            if(n>=2)s[2][1]='U';
            
        }
        /*
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cout<<s[i][j];
            }
            cout<<endl;
        }
        */
        //查询
        
        for(int i=1;i<n*m;i++){
            int xx,yy;
            cin>>xx>>yy;
            query(stx,sty,xx,yy,0);
            stx=xx;sty=yy;
            
        }
        
    }
    else{//奇数换路跑两次
        for(int i=n;i>=2;i--){
            s[i][1]='U';
        }
        if(n>=2) s[2][1]='R';
        if(n>=2 && m>=2) s[2][2]='U';
        for(int i=2;i<=m-1;i++){
            if(i%2==0){
                s[1][i]='R';
            }
            else{
                s[2][i]='R';
            }
        }
        for(int i=3;i<=m-1;i++){
            if(i%2==1){
                s[1][i]='D';
            }
            else{
                s[2][i]='U';
            }
        }
        s[1][m]='D';
        if(n>=2) s[2][m]='D';
        for(int i=3;i<=n;i+=2){
            for(int j=3;j<=m;j++){
                s[i][j]='L';
            }
        }
        for(int i=4;i<=n;i+=2){
            for(int j=2;j<=m-1;j++){
                s[i][j]='R';
            }
        }
        for(int i=3;i<=n;i++){
            if(i%2==1){
                s[i][2]='D';
            }
            else{
                s[i][m]='D';
            }
        }
        if(m>=2) s[n][2]='L';
        /*
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cout<<s[i][j];
            }
            cout<<endl;
        }
        */
        
        for(int i=1;i<n*m;i++){
            int xx,yy;
            cin>>xx>>yy;
            query(stx,sty,xx,yy,1);
            stx=xx;sty=yy;
            
        }
        
    }
}
posted @ 2025-08-29 11:54  White_ink  阅读(19)  评论(0)    收藏  举报