VelvetChords @ 2024-10-28 13:47:15
#include<bits/stdc++.h>
using namespace std;
int T,n,m,k,x,y,d;
char a[1005][1005];
bool f[1005][1005];
int main(){
cin>>T;
while(T--)
{
cin>>n>>m>>k>>x>>y>>d;
long long ans=0;
memset(f,0,sizeof f);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=1;i<=k;i++)
{
f[x][y]=1;
if(d==0)
{
if(a[x][y+1]=='.') y++;
else if(a[x+1][y]=='.') d=1;
else if(a[x][y-1]=='.') d=2;
else if(a[x-1][y]=='.') d=3;
}
else if(d==1)
{
if(a[x+1][y]=='.') x++;
else if(a[x][y-1]=='.') d=2;
else if(a[x-1][y]=='.') d=3;
else if(a[x][y+1]=='.') d=0;
}
else if(d==2)
{
if(a[x][y-1]=='.') y--;
else if(a[x-1][y]=='.') d=3;
else if(a[x][y+1]=='.') d=0;
else if(a[x+1][y]=='.') d=1;
}
else if(d==3)
{
if(a[x-1][y]=='.') x--;
else if(a[x][y+1]=='.') d=0;
else if(a[x+1][y]=='.') d=1;
else if(a[x][y-1]=='.') d=2;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(f[i][j]==1) ans++;
cout<<ans<<endl;
}
return 0;
}
by PeacefulStagnation @ 2024-10-28 13:53:30
评价: ①这种做法是错的。 ②因为: 1、代码if过于杂乱,建议用函数。 2、先判断能不能走再标记(注意,先把起点标记了) ③综上所述,我们写代码时应该认识到代码可读性的重要性,这样有利于我们AC/AKCSP。
by PeacefulStagnation @ 2024-10-28 13:53:51
评价: ①这种做法是错的。
②因为: 1、代码if过于杂乱,建议用函数。 2、先判断能不能走再标记(注意,先把起点标记了)
③综上所述,我们写代码时应该认识到代码可读性的重要性,这样有利于我们AC/AKCSP。
by VelvetChords @ 2024-10-28 13:57:25
//仍然30分
#include<bits/stdc++.h>
using namespace std;
int T,n,m,k,x,y,d;
char a[1005][1005];
bool f[1005][1005];
int main(){
cin>>T;
while(T--)
{
cin>>n>>m>>k>>x>>y>>d;
long long ans=0;
memset(f,0,sizeof f);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
f[1][1]=1;
for(int i=1;i<=k;i++)
{
if(d==0)
{
if(a[x][y+1]=='.')
{
y++;
f[x][y]=1;
}
else if(a[x+1][y]=='.') d=1;
else if(a[x][y-1]=='.') d=2;
else if(a[x-1][y]=='.') d=3;
}
else if(d==1)
{
if(a[x+1][y]=='.')
{
x++;
f[x][y]=1;
}
else if(a[x][y-1]=='.') d=2;
else if(a[x-1][y]=='.') d=3;
else if(a[x][y+1]=='.') d=0;
}
else if(d==2)
{
if(a[x][y-1]=='.')
{
y--;
f[x][y]=1;
}
else if(a[x-1][y]=='.') d=3;
else if(a[x][y+1]=='.') d=0;
else if(a[x+1][y]=='.') d=1;
}
else if(d==3)
{
if(a[x-1][y]=='.')
{
x--;
f[x][y]=1;
}
else if(a[x][y+1]=='.') d=0;
else if(a[x+1][y]=='.') d=1;
else if(a[x][y-1]=='.') d=2;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(f[i][j]==1) ans++;
cout<<ans<<endl;
}
return 0;
}
by PeacefulStagnation @ 2024-10-28 14:00:25
自定义函数呢?!
by VelvetChords @ 2024-10-28 14:01:02
为什么要用呀?
不想用呢》
by PeacefulStagnation @ 2024-10-28 14:01:31
不想用就别想对(
by VelvetChords @ 2024-10-28 14:02:00
调不调
by tangchenhui @ 2024-10-28 14:26:04
问题出在右转应该不算在步数内。
所以如果 a[x'][y']
不是能走的点的话,应该用 while 循环转向。
by tangchenhui @ 2024-10-28 14:31:38
噢,对不起,题目看错了
by tangchenhui @ 2024-10-28 14:52:11
额,一共有三个错误
1.初始化时没有清空 .
,所以前一组较大的
2.由于初始节点要标记,终止节点也要标记,所以你在退出循环后没有标记更新后的
3.题目要求转向一次就,所以转向的部分错了,如果
代码放在下面,但建议自己写一遍。
#include<bits/stdc++.h>
using namespace std;
int T,n,m,k,x,y,d;
char a[1005][1005];
bool f[1005][1005];
int main(){
cin>>T;
while(T--)
{
cin>>n>>m>>k>>x>>y>>d;
long long ans=0;
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=1;i<=k;i++)
{
f[x][y]=1;
if(d==0)
{
if(a[x][y+1]=='.') y++;
else d=1;
}
else if(d==1)
{
if(a[x+1][y]=='.') x++;
else d=2;
}
else if(d==2)
{
if(a[x][y-1]=='.') y--;
else d=3;
}
else if(d==3)
{
if(a[x-1][y]=='.') x--;
else d=0;
}
}
f[x][y]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(f[i][j]==1) ans++;
cout<<ans<<endl;
}
return 0;
}