qzezoj 1582 DFS or BFS?

题面传送门
直接暴力 B F S BFS BFS,判断当前点和下一个单位时间有没有石头,并且当时间 > 22 >22 >22时就跳出。
为什么是 22 22 22呢?
考虑极端情况,一块石头在 1 , x 1,x 1,x的位置,如果这块石头掉到底部要 8 8 8单位时间,然后如果现在再开始走,走到终点要 14 14 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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值