50求调

P11228 [CSP-J 2024] 地图探险

mc2djwh @ 2024-10-26 23:03:40

丸辣!!!大jx160还有机会1=吗

#include <bits/stdc++.h>
using namespace std;
int main(){
    int T;
    cin>>T;
    while(T--){
        int n,m,k,x,y,d,ans=1;
        cin>>n>>m>>k>>x>>y>>d;
        char a[n][m];
        bool vis[n][m]={};
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cin>>a[i][j];
            }
        }
        x--,y--;
        vis[x][y]=1;
        while(--k){
            if(d==0){
                if(y+1<m&&a[x][y+1]=='.'){
                    if(!vis[x][y+1]){
                        ans++;
                        vis[x][y+1]=1;
                    }
                    y++;
                }else{
                    d=1;
                }
            }
            if(d==1){
                if(x+1<n&&a[x+1][y]=='.'){
                    if(!vis[x+1][y]){
                        ans++;
                        vis[x+1][y]=1;
                    }
                    x++;
                }else{
                    d=2;
                }
            }
            if(d==2){
                if(y-1>=0&&a[x][y-1]=='.'){
                    if(!vis[x][y-1]){
                        ans++;
                        vis[x][y-1]=1;
                    }
                    y--;
                }else{
                    d=3;
                }
            }
            if(d==3){
                if(x-1>=0&&a[x-1][y]=='.'){
                    if(!vis[x-1][y]){
                        ans++;
                        vis[x-1][y]=1;
                    }
                    x--;
                }else{
                    d=0;
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

by rqzhangzehao @ 2024-10-26 23:26:32

我和你也有过一样的经历 其实,你看一看你的d(方向),他的每一次向右转也算一次操作,而你的d在当d一开始等于0的时候没路可走,就会让d=1,然后你就会执行第2个if,但你没有让操作次数--,应改为else if


by rqzhangzehao @ 2024-10-26 23:28:47

改前:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
char s[1005][1005];
bool t[1005][1005];
ll cnt=1;
int main(){
    ll T;
    cin>>T;
    while(T--){
        ll n,m,k;
        cin>>n>>m>>k;
        ll x,y,d;
        cin>>x>>y>>d;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>s[i][j];
                t[i][j]=0;
            }
        }
        t[x][y]=1;
        k--;
        while(true){
            if(d==0){
                if(y+1>m)d++;
                else if(s[x][y+1]=='x')d++;
                else{
                    if(!t[x][y+1])cnt++;
                    y++;
                }
                t[x][y]++;
            }
            if(d==1){
                if(x+1>n)d++;
                else if(s[x+1][y]=='x')d++;
                else{
                    if(!t[x+1][y])cnt++;
                    x++;
                }
                t[x][y]++;
            }
            if(d==2){
                if(y-1<=0)d++;
                else if(s[x][y-1]=='x')d++;
                else{
                    if(!t[x][y-1])cnt++;
                    y--;
                }
                t[x][y]++;
            }
            if(d==3){
                if(x-1<=0)d=0;
                else if(s[x-1][y]=='x')d=0;
                else{
                    if(!t[x-1][y])cnt++;
                    x--;
                }
                t[x][y]++;
            }
            k--;
            if(!k)break;
//          cout<<cnt<<"("<<x<<","<<y<<")"<<endl;
        }
        cout<<cnt<<endl;
        cnt=1;
    }
} 

改后:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
char s[1005][1005];
bool t[1005][1005];
ll cnt=1;
int main(){
    ll T;
    cin>>T;
    while(T--){
        ll n,m,k;
        cin>>n>>m>>k;
        ll x,y,d;
        cin>>x>>y>>d;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>s[i][j];
                t[i][j]=0;
            }
        }
        t[x][y]=1;
        while(k--){
            if(d==0){
                if(y+1>m)d++;
                else if(s[x][y+1]=='x')d++;
                else{
                    if(!t[x][y+1])cnt++;
                    y++;
                }
                t[x][y]++;
            }
            else if(d==1){
                if(x+1>n)d++;
                else if(s[x+1][y]=='x')d++;
                else{
                    if(!t[x+1][y])cnt++;
                    x++;
                }
                t[x][y]++;
            }
            else if(d==2){
                if(y-1<=0)d++;
                else if(s[x][y-1]=='x')d++;
                else{
                    if(!t[x][y-1])cnt++;
                    y--;
                }
                t[x][y]++;
            }
            else if(d==3){
                if(x-1<=0)d=0;
                else if(s[x-1][y]=='x')d=0;
                else{
                    if(!t[x-1][y])cnt++;
                    x--;
                }
                t[x][y]++;
            }
        }
        cout<<cnt<<endl;
        cnt=1;
    }
} 

by mc2djwh @ 2024-10-26 23:58:18

@rqzhangzehao 哎,没救了,不过谢谢


by Zebraj @ 2024-10-27 08:57:57

@Dengjinheng2012 其实你不需要自己写自己的代码,按题意模拟即可

#include <bits/stdc++.h>
using namespace std;

int main(){
    int T;
    cin>>T;
    while(T--){
        int n,m,x,y,k,d,ans=0;
        cin>>n>>m>>k>>x>>y>>d;
        bool vis[n+1][m+1]={};
        vis[x][y]=1;
        char a[n+1][m+1];
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>a[i][j];
            }
        }
        while(k--){
            int nowx,nowy;
            if(d==0){
                nowx=x,nowy=y+1;
            }else if(d==1){
                nowx=x+1,nowy=y;
            }else if(d==2){
                nowx=x,nowy=y-1;
            }else{
                nowx=x-1,nowy=y;
            }
            if(nowx>n||nowx<1||nowy>m||nowy<1||a[nowx][nowy]=='x'){
                d=(d+1)%4;
                continue;
            }
            x=nowx;
            y=nowy;
            if(vis[x][y]==0){
                ans++;
            }
            vis[x][y]=1;
        }
        cout<<ans+1<<endl;
    }
    return 0;
}

|