SCU 4445 Right turn(dfs)题解

思路:离散化之后,直接模拟就行,标记vis开三维

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn = 1e3 + 10;
const ll mod = 1e8 + 7;
struct node{
    ll x, y;
}p[maxn];
int mp[maxn][maxn], turn_num, vis[maxn][maxn][4], nn, mm;
ll x[maxn], y[maxn];
int dir[4][2] = {1, 0, 0, -1, -1, 0, 0, 1};
//下,左,上,右
bool dfs(int xx, int yy, int turn){ //将要朝向turn
    if(vis[xx][yy][turn]) return false;
    vis[xx][yy][turn] = 1;
    int xxx = xx + dir[turn][0], yyy = yy + dir[turn][1];
    if(xxx < 0 || xxx > nn - 1 || yyy < 0 || yyy > mm - 1)
        return true;
    while(mp[xxx][yyy] != 1){
        if(vis[xxx][yyy][turn]) return false;
        vis[xxx][yyy][turn] = 1;
        xxx += dir[turn][0];
        yyy += dir[turn][1];
        if(xxx < 0 || xxx > nn - 1 || yyy < 0 || yyy > mm - 1)
            return true;
    }

    turn_num++;
    return dfs(xxx - dir[turn][0], yyy - dir[turn][1], (turn + 1) % 4);
}

int main(){
    int n, sx, sy;
    while(scanf("%d", &n) != EOF){
        turn_num = 0;
        memset(mp, 0, sizeof(mp));
        memset(vis, 0, sizeof(vis));
        for(int i = 0; i < n; i++){
            scanf("%lld%lld", &p[i].x, &p[i].y);
            x[i] = p[i].x;
            y[i] = p[i].y;
        }
        x[n] = 0, y[n] = 0, p[n].x = 0, p[n].y = 0;
        n++;
        sort(x, x + n);
        sort(y, y + n);
        int num1 = unique(x, x + n) - x;
        int num2 = unique(y, y + n) - y;
        for(int i = 0; i < n; i++){
            int X, Y;
            X = lower_bound(x, x + num1, p[i].x) - x;
            Y = lower_bound(y, y + num2, p[i].y) - y;
            if(p[i].x == 0 && p[i].y == 0){
                sx = X, sy = Y;
            }
            else{
                mp[X][Y] = 1;
            }
        }
        nn = num1, mm = num2;
        bool flag = dfs(sx, sy, 0);
        if(flag) printf("%d\n", turn_num);
        else printf("-1\n");
    }
    return 0;
}
/*
4
1 0
0 1
0 -1
-1 0
*/

原文地址:https://www.cnblogs.com/KirinSB/p/9891020.html

时间: 2024-10-03 19:46:59

SCU 4445 Right turn(dfs)题解的相关文章

SCU 4445 Right turn

模拟. 每次找一下即将要遇到的那个点,这个数据范围可以暴力找,自己的写的时候二分了一下.如果步数大于$4*n$一定是$-1$. #include<bits/stdc++.h> using namespace std; const int INF = 0x7FFFFFFF; const int mod = 1e9 + 7; const int N = 5e6 + 10; const int M = 1e4 + 1; const double eps = 1e-10; int T,n,m; str

scu oj 4445 Right turn 2015年四川省赛J题(模拟题)

一般的模拟题.对于出现过的每一个x建立一个set 集合,对于y也如此.然后查找要走到哪个点即可,主要要对状态记录,判断是否无线循环,否者出现无线循环的情况,就tle了. #include<stdio.h> #include<string.h> #include<iostream> #include<string> #include<queue> #include<cmath> #include<map> #include&

Right turn

Right turn Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main frog is trapped in a maze. The maze is infinitely large and divided into grids. It also consists of n obstacles, where the i-th obstacle lie

1月 D - 逃离迷宫 HDU - 1728-复杂dfs的剪枝

给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去.令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的.我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一

【NOIP2016】天天爱跑步

Description 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一棵包含n个结点和n-1条边的树,每条边连接两个结点,且任意两个结点存在一条路径互相可达.树上结点编号为从1到n的连续正整数. 现在有m个玩家,第i个玩家的起点为Si,终点为Ti.每天打卡任务开始时,所有玩家在第0秒同时从自己的起点出发,以每秒跑一条边的速度,不间断地沿着最短路径向着自己的终点跑去,跑

Leetcode题解 - 树、DFS部分简单题目代码+思路(700、671、653、965、547、473、46)

700. 二叉搜索树中的搜索 - 树 给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 NULL. 思路: 二叉搜索树的特点为左比根小,右比根大.那么目标结点就有三种可能: 1. 和根一样大,那么直接返回根即可. 2. 比根的值小,那么应该再去次左子树中搜索. 3. 比根的值大,那么应该再次去右子树中搜索. 可以看到这就是一个递归的思路. class Solution: def searchBST(self

SCU Right turn

Right turn frog is trapped in a maze. The maze is infinitely large and divided into grids. It also consists of n obstacles, where the i-th obstacle lies in grid (xi,yi) . frog is initially in grid (0,0) , heading grid (1,0) . She moves according to T

PAT甲题题解-1103. Integer Factorization (30)-(dfs)

该题还不错~. 题意:给定N.K.P,使得可以分解成N = n1^P + - nk^P的形式,如果可以,输出sum(ni)最大的划分,如果sum一样,输出序列较大的那个.否则输出Impossible. dfs枚举,为了防止超时,这里要预先将从1开始的i^p的值存储在factor数组中,直到i^p>n.然后dfs深度优先搜索,相当于把问题一步步分解,即若第一个因子是n1,则接下来我们要判断N-n1^p.k-1是否可行.同时存储当前因子的总和sum,要取sum最大的:还有上一次相加的因子的索引las

第三次周赛题解【并查集 KMP DFS BFS 快速幂】

问题 A: 一道签到题 时间限制: 2 Sec  内存限制: 128 MB 提交: 63  解决: 28 [提交][状态][讨论版] 题目描述 我想说这是一道签到题,意思就是本次测试中最水的一道,不过我这样说你真的愿意相信我吗?哈哈,题目是这样的给你一下小数,然后请告诉我分别告诉我这个小数的循环节的循环次数.循环节以及循环节长度 输入 输入包括多组测试数据每组测试数据1行,包括一个小数,小数的长度不超过200,小数大于0小于100 输出 分别输出这个小数的循环节的长度.循环节以及循环次数,中间以