2025-10-06 21:49:01
发布于:广东
改了3个小时死活过不了,根本不知道错哪了
#include<cstdio>
#include<vector>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
vector<int> cnt(T,0);
for(int aa=0;aa<T;++aa)
{
int n,m,k,x,y,d;
scanf("%d%d%d%d%d%d",&n,&m,&k,&x,&y,&d);
vector<vector<char>> matrix(n,vector<char>(m,' '));
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
scanf(" %c",&matrix[i][j]);
}
int x1,y1;
for(int i=0;i<k;++i)
{
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;
}
if(1<=x&&x<=n&&1<=y&&y<=m&&matrix[x-1][y-1]=='.')
++cnt[aa];
switch(d)
{
case 0:
y+=1;
break;
case 1:
x+=1;
break;
case 2:
y-=1;
break;
case 3:
x-=1;
break;
}
}
}
for(int num:cnt)
printf("%d\n",num);
return 0;
}
大佬们救救我这个FW吧
全部评论 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小时前 来自 广东
0x1=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
有帮助,赞一个