题目大意

机器人在 n 行 m 列地图上,.空地,x障碍。
方向:0 东 (y+1),1 南 (x+1),2 西 (y‑1),3 北 (x‑1)
一共执行 k 次操作,每一步:
计算向前一步的坐标nx,ny
如果nx,ny在边界内且是空地:就走过去,朝向不变
否则:原地不动,向右转 d=(d+1)%4
求:所有经过过的格子总数,包含起始位置。

核心思路

这是一道纯模拟题,没有复杂算法,核心就是:严格照着题目描述,把机器人每一步行为翻译成代码。

AC代码

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

const int MAXN=1005;
int a[MAXN][MAXN];
bool vis[MAXN][MAXN];
//偏移量数组 
int dx[4]={0, 1, 0, -1};
int dy[4]={1, 0, -1, 0};

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,m,k;
        cin>>n>>m>>k;
        int x,y,d;
        cin>>x>>y>>d;

        // 初始化vis全部false
        memset(vis, 0, sizeof vis);

        for(int i=1;i<=n;i++)
        {
            string s;
            cin>>s;
            for(int j=1;j<=m;j++)
            {
                if(s[j-1]=='x') a[i][j]=0;
                else a[i][j]=1;
            }
        }

        // 起点标记走过
        vis[x][y]=true;
        int ans=1;

        while(k--)
        {
            int nx = x + dx[d];
            int ny = y + dy[d];
            // 判断边界+空地
            if(nx>=1 && nx<=n && ny>=1 && ny<=m && a[nx][ny]==1)
            {
                // 向前走
                x=nx;
                y=ny;
                if(!vis[x][y])
                {
                    vis[x][y]=true;
                    ans++;
                }
            }
            else
            {
                // 右转,原地不动
                d=(d+1)%4;
            }
        }
        cout<<ans<<'\n';
    }
    return 0;
}
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐