把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

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);
    }
}
posted @ 2020-03-31 17:49  275307894a  阅读(34)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end