zoukankan      html  css  js  c++  java
  • zoj 2110 很好的dfs+奇偶剪枝

    //我刚开始竟然用bfs做,不断的wa,bfs是用来求最短路的而这道题是求固定时间的
    //剪纸奇偶剪枝加dfs
    #include<stdio.h>
    #include<queue>
    #include<math.h>
    #include<string.h>
    using namespace std;
    #define N  10
    char ma[N][N];
    struct node {
    int x,y,step;
    }ss,tt;
    int dis[4][2]={1,0,-1,0,0,1,0,-1},n,m,t;
    int vis[N][N];
    int judge(int x,int y) {
    if(ma[x][y]!='X'&&x>=1&&x<=n&&y>=1&&y<=m&&!vis[x][y])//刚开始这里少些!vis[x][y]导致wa
        return 1;
    return 0;
    }
    int dfs(int x,int y,int step) {
     int xx,yy,st,i;
     if(ma[x][y]=='D'&&step==t)return 1;
     if(step>=t)  return 0;
     for(i=0;i<4;i++) {
        xx=x+dis[i][0];
        yy=y+dis[i][1];
        st=step+1;
        if(judge(xx,yy)) {
        vis[xx][yy]=1;
        if(dfs(xx,yy,st))return 1;
        vis[xx][yy]=0;
        }
     }
     return 0;
    }
    int main() {
       int i,j,k;
       while(scanf("%d%d%d",&n,&m,&t),n||m||t) {
          for(i=1;i<=n;i++)
            scanf("%s",ma[i]+1);
            k=0;
         for(i=1;i<=n;i++)
         for(j=1;j<=m;j++) {
            if(ma[i][j]=='S') {
                ss.x=i;
                ss.y=j;
            }
            if(ma[i][j]=='D') {
                tt.x=i;
                tt.y=j;
            }
            if(ma[i][j]=='X')
                k++;
         }
         if(n*m-k<t||(((int)fabs(tt.x-ss.x)+(int)fabs(tt.y-ss.y))%2!=t%2)) {
            printf("NO
    ");
            continue;
         }
         memset(vis,0,sizeof(vis));
         vis[ss.x][ss.y]=1;
         if(dfs(ss.x,ss.y,0))
         printf("YES
    ");
         else
            printf("NO
    ");
       }
    return 0;
    }
    

  • 相关阅读:
    Typora使用腾讯云图床
    2020年8月总结
    113 路径之和II
    103 二叉树的锯齿形层次遍历
    128 最长连续序列
    160 相交链表
    33 搜索旋转排序数组
    学习制作GitHub徽标
    105 从前序与中序遍历序列构造二叉树
    重新封装了layer.tips,自定义跟随弹窗
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410629.html
Copyright © 2011-2022 走看看