• 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;
    }
    

  • 相关阅读:
    一些常用的库
    isKindOfClass isMemeberOfClass 的区分
    自学知识的博客
    更新进度
    ORA-01950:对表空间“”XXXX”无权限,解决办法
    ORA-01589错误的解决办法
    背景四
    专题-主存储器与Cache的地址映射方式
    C语言中宏的相关知识
    Lab1:Linux内核编译及添加系统调用(详细版)
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410629.html
Copyright © 2020-2023  润新知