【DFS】HDU 1364 && POJ 1071 Illusive Chase

数据水了。。。

不知道正解是什么

将TOM放在一个0上经过输入的  1 2 R 这样走 还能在图上则这个点可行(走的过程中不能走出图)

求有几个0 可行

直接dfs 完全没有别的思路

题目要求必须 走 A - B 步 所以在走A步不能遇到 1

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <cctype>
#include <cmath>
#include <string>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
typedef long long LL;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define pi acos(-1.0)
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
typedef pair<int, int> PI;
typedef pair<int, PI> PP;
#ifdef _WIN32
#define LLD "%I64d"
#else
#define LLD "%lld"
#endif
//LL quick(LL a, LL b){LL ans=1;while(b){if(b & 1)ans*=a;a=a*a;b>>=1;}return ans;}
inline int read()
{
    char ch=' ';
    int ans=0;
    while(ch<'0' || ch>'9')ch=getchar();
    while(ch<='9' && ch>='0')
    {
        ans=ans*10+ch-'0';
        ch=getchar();
    }
    return ans;
}
//inline void print(LL x){printf(LLD, x);puts("");}
bool mp[105][105];
PP step[1005];
int d, m, n;
bool solve(int r, int c,int x)
{
    if(r>=m || c>=n)
        return false;
    if(r<0 || c<0)
        return false;
    if(x==d)
        if(!mp[r][c])
            return true;
        else return false;
    int a=step[x].second.first;
    int b=step[x].second.second;
    //bool flag=0;
    if(step[x].first==0)
    {
        for(int i=c-1; i>=c-a; i--)
        {
            if(i<0)
                return false;
            if(mp[r][i])
                return false;
        }
        for(int i=c-a; i>=c-b; i--)
        {
            if(solve(r,i,x+1))
                return true;
        }
    }
    if(step[x].first==1)
    {
        for(int i=c+1; i<=c+a; i++)
        {
            if(i>=n)
                return false;
            if(mp[r][i])
                return false;
        }
        for(int i=c+a; i<=c+b; i++)
        {
            if(solve(r,i,x+1))
                return true;
        }
    }
    if(step[x].first==2)
    {
        for(int i=r-1; i>=r-a; i--)
        {
            if(i<0)
                return false;
            if(mp[i][c])
                return false;
        }
        for(int i=r-a; i>=r-b; i--)
        {
            if(solve(i,c,x+1))
                return true;
        }
    }
    if(step[x].first==3)
    {
        for(int i=r+1; i<=r+a; i++)
        {
            if(i>=m)
                return false;
            if(mp[i][c])
                return false;
        }
        for(int i=r+a; i<=r+b; i++)
        {
            if(solve(i,c,x+1))
                return true;
        }
    }
    return false;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    int t=read();
    while(t--)
    {
        m=read(), n=read();
        for(int i=0; i<m; i++)
            for(int j=0; j<n; j++)
                mp[i][j]=read();
        d=0;
        while(true)
        {
            int a=read(), b=read();
            if(a==0 && b==0)
                break;
            char op[2];
            int c;
            scanf("%s", op);
            if(op[0]=='L')
                c=0;
            else if(op[0]=='R')
                c=1;
            else if(op[0]=='U')
                c=2;
            else if(op[0]=='D')
                c=3;
            step[d++]=make_pair(c, make_pair(a, b));
        }
        int ans=0;
        for(int i=0; i<m; i++)
            for(int j=0; j<n; j++)
                if(!mp[i][j])
                    if(solve(i, j,0))
                        ans++;
        printf("%d\n", ans);
    }
    return 0;
}
时间: 2024-12-16 09:58:20

【DFS】HDU 1364 && POJ 1071 Illusive Chase的相关文章

【dfs】hdu 1016 Prime Ring Problem

[dfs]hdu 1016 Prime Ring Problem 题目链接 刚开始接触搜索,先来一道基本题目练练手. 注意对树的深度进行dfs dfs过程中注意回退!!! 素数提前打表判断快一些 参考代码 /*Author:Hacker_vision*/ #include<bits/stdc++.h> #define clr(k,v) memset(k,v,sizeof(k)) using namespace std; const int _max=1e3+10;//素数打表 int n,pr

【dfs】hdu 1175 连连看

[dfs]hdu 1175 连连看 题目链接:hdu 1175 连连看 题目大意 连连看,问能否成功? 题意很简单,就是我们平时玩的连连看的游戏规则,貌似dfs和bfs都能做,笔者就做了个dfs(好想),超时了好几次,原因是dfs(int d)与终点的d重载矛盾了,所以还是要小心. 说一下思路 神器的剪枝:if(t==2&&x!=c&&y!=d) return;这一部剪枝妙笔回春,9000+MS优化到100+MS啊:如果转了2次,但是目标与当前位置不在同一行或同一列就不满足

POJ 1071 &amp; HDU 1364 &amp; ZOJ 1019 Illusive Chase(DFS)

题目链接: POJ:http://poj.org/problem?id=1071 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1364 ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=19 Description Tom the robocat is presented in a Robotics Exhibition for an enthusiastic audien

【DFS】hdu 1584 蜘蛛牌

看代码: #include <iostream> #include <cstdio> #include <fstream> using namespace std; const int INF=100000000; const int MAXN=1000000; int ans; int pos[11]; bool vis[11]; int abs(int a,int b){ if(a>b)return a-b; return b-a; } void dfs(in

poj 3009 Curling 2.0 【DFS】

题意:从2出发,要到达3, 0可以通过,碰到1要停止,并且1处要变成0, 并且从起点开始沿着一个方向要一直前进,直至碰到1(或者3)处才能停止,(就是反射来反射去知道反射经过3).如果反射10次还不能到达3,就输出-1. 策略:深搜. 易错点,方向不容易掌握,并且,出题人把n, m顺序反了. 代码: #include<stdio.h> #include<string.h> int map[25][25]; int ans, n, m; const int dir[4][2] = {

poj 1011 Sticks 【DFS】+【剪枝】

题意:有未知根(长度一样)木棒(小于等于n),被猪脚任意的截成n段,猪脚(脑抽了)想知道被截之前的最短长度(我推测猪脚得了健忘症). 这道题光理解题意就花了好久,大意就是任意根被截后的木棒拼到一起,能不能组成s(<=n)根的相同的木棒, 例:数据 9  5 1 2 5 1 2 5 1 2 可以组成最短为6 的(5+1, 2+2+2)3根木棒. 策略:深搜. 不过要是传统的深搜的话,TLE妥妥的.所以要剪枝(所谓剪枝,就是多加几个限制条件). 话不多说直接上代码. 代码1: #include <

poj 1321 棋盘问题 【DFS】

题意:... 策略:深搜. 仔细分析我们发现,我们只需要对列进行标记,对于行我们考虑放棋子还是不放就行了. 代码: #include<stdio.h> #include<string.h> char s[10][10]; int n, m; int vis[10]; int ans; void dfs(int cur, int step) { if(step == m){ ans ++; return; } if(cur > n-1) return ; int i, j; f

poj 1088 滑雪 【记忆化搜索】+【DFS】

策略:如题 题目链接:http://poj.org/problem?id=1088 代码: #include<stdio.h> #include<string.h> int map[105][105], dp[105][105], n, m; const int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0}; //四个方向 int limit(int x, int y) //判断是不是越界了 { if(x<1||x>n||y<1||

HDU 6113 度度熊的01世界 【DFS】(2017&quot;百度之星&quot;程序设计大赛 - 初赛(A))

度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1117    Accepted Submission(s): 400 Problem Description 度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由0和1组成. 现在给你一个n*m的图像,你需要分辨他究竟是0,还是1,或者两者均不是. 图像0