• DFS Zoj 2110


    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2110

    
    
    
    //2110
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<iostream>
    #include<cstdlib>
    using namespace std;
    int n, m, t, di, dj, flag;
    char map[10][10];
    int dir[4][2]={{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    void dfs(int si, int sj, int cnt)
    {
        int i, xx, yy;
        if(si<=0||sj<=0||si>n||sj>m) return ;
        if(si==di&&sj==dj&&cnt==t)
        {
            flag=1;
            return ;
        }
        int temp=t-cnt-abs(si-di)-abs(sj-dj);
        if(temp<0 || temp%2)
            return ;
        for(i=0; i<4; i++)
        {
            xx=si+dir[i][0], yy=sj+dir[i][1];
            if(map[xx][yy]!='X')
            {
                map[xx][yy]='X';
                dfs(xx, yy, cnt+1);
                if(flag)  return;
                map[xx][yy]='.';
            }
        }
        return ;
    }    
    int main()
    {
        int i, j, si, sj;
        while(scanf("%d%d%d", &n, &m, &t)!=EOF)
        {
            if(n==0&&m==0&&t==0)  break;
            memset(map, 0, sizeof(map));
            int wal=0;
            char temp;
            scanf("%c", &temp);
            for(i=1; i<=n; i++)
            {
                //scanf("%s%*c", map[i]);
                for(j=1; j<=m; j++)
                { 
                    scanf("%c", &map[i][j]);
                    if(map[i][j]=='S')
                        si=i, sj=j;
                    else if(map[i][j]=='D')
                        di=i, dj=j;
                    else if(map[i][j]=='X')
                        wal++;
                }
                scanf("%c", &temp);
            }
            if(n*m-wal<=t)
            {
                printf("NO
    ");
                continue;
            }
            flag=0;
            map[si][sj]='X';
            dfs(si, sj, 0);
            if(flag)
                printf("YES
    ");
            else
                printf("NO
    ");
        }
        return 0;
    }  
    
    
    
    
    
    ****************************************
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<iostream>
    #include<cstdlib>
    using namespace std;
    int n, m, t, dx, dy, flag;
    char map[10][10];
    int dir[4][2]={{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    void dfs(int x, int y, int step)
    {
        int i, xx, yy;
        if(x<=0||y<=0||x>n||y>m) return ;
        if(x==dx&&y==dy&&step==t)
        {
            flag=1;
            return ;
        }
        int temp=t-step-abs(x-dx)-abs(y-dy);
        if(temp<0 || temp%2)
            return ;
        for(i=0; i<4; i++)
        {
            xx=x+dir[i][0], yy=y+dir[i][1];
            if(map[xx][yy]!='X')
            {
                map[xx][yy]='X';
                dfs(xx, yy, step+1);
                if(flag)  return;
                map[xx][yy]='.';
            }
        }
        return ;
    }    
    int main()
    {
        int i, j, x, y;
        while(scanf("%d%d%d", &n, &m, &t)!=EOF)
        {
            if(n==0&&m==0&&t==0)  break;
            memset(map, 0, sizeof(map));
            int wal=0;
            char temp;
            scanf("%c", &temp);
            for(i=1; i<=n; i++)
            {
                //scanf("%s%*c", map[i]);
                for(j=1; j<=m; j++)
                { 
                    scanf("%c", &map[i][j]);
                    if(map[i][j]=='S')
                        x=i, y=j;
                    else if(map[i][j]=='D')
                        dx=i, dy=j;
                    else if(map[i][j]=='X')
                        wal++;
                }
                scanf("%c", &temp);
            }
            if(n*m-wal<=t)
            {
                printf("NO
    ");
                continue;
            }
            flag=0;
            map[x][y]='X';
            dfs(x, y, 0);
            if(flag)
                printf("YES
    ");
            else
                printf("NO
    ");
        }
        return 0;
    }  
    

      



    // zoj 2110 #include <iostream> #include <string.h> #include <stdlib.h> using namespace std; char map[9][9]; //迷宫地图 int n,m,t; //迷宫的大小,及迷宫的门会在第t秒开启 int di,dj; //(di,dj):门的位置 bool escape; int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};//控制行走方向 左 右 下 上 void dfs(int si,int sj,int cnt) //已经到达(si, sj)位置 且已经花费cnt秒 { int i,temp; if (si>n||sj>m||si<=0||sj<=0) return; //起点不再矩阵之内。返回 //边界 if (cnt==t&&si==di&&sj==dj) escape=1;// 起点在门处,且门在零秒的时候开启,成功逃生 if (escape) return; temp=(t-cnt)-abs(si-di)-abs(sj-dj);// if (temp<0||temp&1) return; //temp<0是最短距离小于时间的剪枝,temp&1是奇偶剪枝,还有一种写法,temp%2!=0; for (i=0;i<4;i++) { if (map[si+dir[i][0]][sj+dir[i][1]]!='X')//如果该方格是可以通过的,跳到此空格进行操作 { map[si+dir[i][0]][sj+dir[i][1]]='X';//设置志。变为不可通过,表明已经搜过 dfs(si+dir[i][0],sj+dir[i][1],cnt+1); //从此点开始递归 map[si+dir[i][0]][sj+dir[i][1]]='.'; //递归完,将该点还原 } } return; } int main() { int i,j ; //循环变量 int si,sj; //小狗的起始位置 while (cin>>n>>m>>t) { if (n==0&&m==0&&t==0) break;//测试数据结束 int wall=0; for (i=1;i<=n;i++) for (j=1;j<=m;j++) { cin>>map[i][j]; if (map[i][j]=='S') { si=i; //记录起点位置 sj=j; } else if (map[i][j]=='D') { di=i; //记录门位置 dj=j; } else if (map[i][j]=='X') wall++; //wall 为不能穿越的方格的个数 } if (n*m-wall<=t) //可以走的个数少于等于时间,说明即使全部走,也不能刚好在t时间到达门 { cout<<"NO"<<endl; continue; } escape=0; //逃跑成功标志位,成功了为1,不成功为0 map[si][sj]='X'; dfs(si,sj,0); //从起点出开始深搜,此时时间为零 if (escape) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }

      

  • 相关阅读:
    UBUntu 软件 源配置方法
    oracle 11G direct path read 非常美也非常伤人
    iOS多线程编程(四)------ GCD(Grand Central Dispatch)
    Yii之路(第八)
    UVA
    我喜欢的网易云音乐
    LeetCode_DP_Word Break II
    管理Java垃圾回收的五个建议
    const成员函数总结
    算法之经典排序算法小归纳
  • 原文地址:https://www.cnblogs.com/wc1903036673/p/3461272.html
Copyright © 2020-2023  润新知