wanglovezl @ 2024-11-20 16:43:11
#include<bits/stdc++.h>
using namespace std;
int Map[1005][1005];
int kmap[1005][1005];
int T;
char kmp;
int n,m,k;
int x,y,d;
int ans;
bool check(int x,int y){
if(x>n||x<1||y>m||y<1) return false;
else if(Map[x][y]==1) return false;
return true;
}
void dfs(int x,int y,int d,int cnt,int cna){
if(cna==k) return;
int nx,ny;
if(d==0){
nx=x,ny=y+1;
if(check(nx,ny)==true){
if(kmap[nx][ny]==0) ans++;
kmap[nx][ny]=1;
dfs(nx,ny,d,0,++cna);
}
else if(check(nx,ny)==false){
d=(d+1)%4;
dfs(x,y,d,++cnt,++cna);
}
}
else if(d==1){
nx=x+1,ny=y;
if(check(nx,ny)==true){
if(kmap[nx][ny]==0) ans++;
kmap[nx][ny]=1;
dfs(nx,ny,d,0,++cna);
}
else if(check(nx,ny)==false){
d=(d+1)%4;
dfs(x,y,d,++cnt,++cna);
}
}
else if(d==2){
nx=x,ny=y-1;
if(check(nx,ny)==true){
if(kmap[nx][ny]==0) ans++;
kmap[nx][ny]=1;
dfs(nx,ny,d,0,++cna);
}
else if(check(nx,ny)==false){
d=(d+1)%4;
dfs(x,y,d,++cnt,++cna);
}
}
else if(d==3){
nx=x-1,ny=y;
if(check(nx,ny)==true){
if(kmap[nx][ny]==0) ans++;
kmap[nx][ny]=1;
dfs(nx,ny,d,0,++cna);
}
else if(check(nx,ny)==false){
d=(d+1)%4;
dfs(x,y,d,++cnt,++cna);
}
}
return;
}
int main(){
scanf("%d",&T);
while(T--){
ans=1;
memset(Map,0,sizeof(Map));
memset(kmap,0,sizeof(kmap));
cin>>n>>m>>k;
cin>>x>>y>>d;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>kmp;
if(kmp=='.'){
Map[i][j]=0;
}
else if(kmp=='x'){
Map[i][j]=1;
}
}
}
dfs(x,y,d,0,0);
printf("%d\n",ans);
}
return 0;
}
by zzzz1234567 @ 2024-11-20 16:51:11
起点的kmap要设成1,不然你的起点可能对答案造成两次贡献
by schlutz @ 2024-11-21 18:32:15
直接暴力就行啥都没多做(我考场上就这么做的100分)
by wanglovezl @ 2024-11-25 14:32:32
@zzzz1234567 谢谢