qzezoj 1582 DFS or BFS?
题面传送门
直接暴力\(BFS\),判断当前点和下一个单位时间有没有石头,并且当时间\(>22\)时就跳出。
为什么是\(22\)呢?
考虑极端情况,一块石头在\(1,x\)的位置,如果这块石头掉到底部要\(8\)单位时间,然后如果现在再开始走,走到终点要\(14\)个单位时间。
代码实现:
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int t,n,m,k,a[39][39],f[39][39][39],now,x[139],y[139],tmp,nowx,nowy,flag,ans;
int xp[9]= {0,1,0,-1,1,1,-1,-1,0};
int yp[9]= {1,0,-1,0,1,-1,1,-1,0};
char s;
struct yyy {
int x,y,times;
} cmp;
queue<yyy> q;
int main() {
register int i,j,fs;
scanf("%d",&t);
for(fs=1;fs<=t;fs++) {
tmp=0;
memset(f,0,sizeof(f));
memset(a,0,sizeof(a));
for(i=1; i<=8; i++) {
for(j=1; j<=8; j++) {
s=getchar();
while(s!='.'&&s!='S'&&s!='U'&&s!='A') s=getchar();
if(s=='S') a[i][j]=1;
}
}
while(!q.empty()) q.pop();
q.push((yyy) {8,1,0});
ans=0;
//f[8][1][0]=1;
while(!q.empty()) {
cmp=q.front();
q.pop();
if(cmp.x==1&&cmp.y==8){ans=1;break;}
if(cmp.times>=23) continue;
for(i=0; i<=8; i++) {
nowx=cmp.x+xp[i];
nowy=cmp.y+yp[i];
flag=0;
if(!f[nowx][nowy][cmp.times+1]&&nowx>=1&&nowx<=8&&nowy>=1&&nowy<=8) {
if(cmp.times>=nowx) q.push((yyy) {nowx,nowy,cmp.times+1}),f[nowx][nowy][cmp.times+1]=1;
else if(!a[nowx-cmp.times][nowy]&&!a[nowx-cmp.times-1][nowy]) q.push((yyy) {nowx,nowy,cmp.times+1}),f[nowx][nowy][cmp.times+1]=1;
}
}
}
if(ans)printf("Case #%d: Yes\n",fs);
else printf("Case #%d: No\n",fs);
}
}