全部评论 8

  • #include <bits/stdc++.h>
    using namespace std;
    const int N=1e3+10;
    int t;
    int main(){
    	
    	cin>>t;
        while(t--){
            int n,m,k,x,y,d,vis[N][N];
            char a[N][N];
            cin>>n>>m>>k>>x>>y>>d;
            int X=x,Y=y,cnt=1;  
            for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j],vis[i][j]=0;
            vis[x][y]=1;
            while(k--){
                if(d==1){
                    if(X<n&&a[X+1][Y]=='.') X++;
                    else d=(d+1)%4;
                }else if(d==0){
                    if(Y<m&&a[X][Y+1]=='.') Y++;
                    else d=(d+1)%4;
                }else if(d==3){
                    if(X>1&&a[X-1][Y]=='.') X--;
                    else d=(d+1)%4;
                }else if(d==2){
                    if(Y>1&&a[X][Y-1]=='.') Y--;
                    else d=(d+1)%4;
                }else d=(d+1)%4;
                if(a[X][Y]=='.'&&X>0&&Y>0&&X<=n&&Y<=m&&!vis[X][Y]){
                    cnt++;
                    vis[X][Y]=1;
                }//cout<<cnt<<" "<<X<<" "<<Y<<" "<<d<<endl;
            }cout<<cnt<<endl;
        }
    	
    	return 0;
    }
    
    

    40分钟前 来自 浙江

    0
  • 大佬们的代码看不懂…刚好昨天学了深搜,再逝几次

    1小时前 来自 广东

    0
        x1=x;y1=y;
        if(1>x||n<x||1>y||m<y||matrix[x-1][y-1]=='x') 
        {
        	d=(d+1)%4;
        	x=x1;y=y1;
        }
    
    

    这段代码似乎并没有什么意义,我觉得你应该是想判断此时此刻的位置是否合法,不合法返回到上一步,但你不能确定上一步x,y如何变化,所以你需要在case里面判断当前位置是否合法(最好写个函数判断)

    if(1<=x&&x<=n&&1<=y&&y<=m&&matrix[x-1][y-1]=='.') 
    	++cnt[aa];
    

    如果没有标记数组,你会一直计算,导致答案错误

    • 建议你不要用数组存储答案,以后你要用cnt数组会重名还占内存

    2小时前 来自 天津

    0
  • #include<cstdio>
    #include<vector>
    #include<unordered_set>
    using namespace std;

    int main() {
    int T;
    scanf("%d",&T);
    while(T--) {
    int n,m,k,x,y,d;
    scanf("%d%d%d%d%d%d",&n,&m,&k,&x,&y,&d);
    vector<vector<char>> grid(n,vector<char>(m));
    for(int i=0;i<n;++i) {
    scanf("%s",grid[i].data());
    }
    unordered_set<pair<int,int>> visited;
    visited.insert({x-1,y-1}); // 记录初始位置

        int dx[] = {0,1,0,-1};
        int dy[] = {1,0,-1,0};
        int x=x-1, y=y-1; // 转为0-based
        
        for(int step=0;step<k;++step) {
            int nx = x + dx[d];
            int ny = y + dy[d];
            if(nx<0 || nx>=n || ny<0 || ny>=m || grid[nx][ny]=='x') {
                d = (d+1)%4;
            } else {
                x = nx, y = ny;
                visited.insert({x,y});
            }
        }
        printf("%d\n",visited.size());
    }
    return 0;
    

    }改这样

    3小时前 来自 广东

    0
  • 原代码使用if(1>x||n<x||1>y||m<y)判断边界,但比较运算符应为>而非<
    矩阵索引未转换为0-based
    未处理初始位置为障碍物的情况(题目说明已保证初始位置为空地)
    多次访问同一位置时重复计数
    d=(d+1)%4会导致机器人每次遇到障碍都顺时针转向,可能陷入死循环

    3小时前 来自 广东

    0
  • #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define a first
    #define b second
    void solve(){
    	int n,m,k;
        cin>>n>>m>>k;
        vector<vector<char>>a(n+1,vector<char>(m+1));
        vector<vector<bool>>vis(n+1,vector<bool>(m+1,false));
        int x,y,d;
        cin>>x>>y>>d;
        for(int i=1;i<=n;i++){
         	for(int j=1;j<=m;j++){
             	cin>>a[i][j];   
            }
        }
        vis[x][y]=1;
        auto check=[&](int i,int j)->bool{
        	if(i<=0||i>n||j<=0||j>m||a[i][j]=='x')return false;
            return true;
        };
        int ct=1;
        while(k--){
         	if(d==0){
             	if(check(x,y+1)){
                 	x=x;
                    y++;
                    if(!vis[x][y])ct++;
                    vis[x][y]=1;
                }else {
                    d=(d+1)%4;
                }
            }else if(d==1){
                if(check(x+1,y)){
                    x++;
                    y=y;
                    if(!vis[x][y])ct++;
                    vis[x][y]=1;
                }else {
                    d=(d+1)%4;
                }
            }else if(d==2){
                if(check(x,y-1)){
                 	x=x;
                    y--;
                    if(!vis[x][y])ct++;
                    vis[x][y]=1;
                }else {
                    d=(d+1)%4;
                }
            }else{
                if(check(x-1,y)){
                 	x--;
                    y=y;
                    if(!vis[x][y])ct++;
                    vis[x][y]=1;
                }else {
                    d=(d+1)%4;
                }
            }
        }
        cout<<ct<<"\n";
        return;
    }
    signed main(){
        // freopen("explore.in","r",stdin);
        // freopen("explore.out","w",stdout);
    	int T;
        cin>>T;
        while(T--)solve();
        
    
        // fclose(stdin);
        // fclose(stdout);
        return 0;
    }
    

    粘个我的代码

    3小时前 来自 天津

    0
  • 反人类了 vector + switch的

    3小时前 来自 广东

    0
  • 你这个

    3小时前 来自 广东

    0

热门讨论