[USACO07OCT]障碍路线 & yzoj P1130 拐弯 题解

题意

给出n* n 的图,A为起点,B为终点,* 为障碍,.可以行走,问最少需要拐90度的弯多少次,无法到达输出-1。

解析

思路:构造N * M * 4个点,即将原图的每个点分裂成4个点。其中点(i,j,k)表示在(i,j)时人的方向是k,然后对于两个点(i,j,k)和(i,j,kk),如果k和kk是两个旋转90度能转换的方向,就连一条边权为1的边,而对于(i,j,k)和(i+dx[ k],j+dy[k],k)连一条边权为0的边,表示从(i,j)在方向为k的情况下能向k方向走一步到达(i+dx[k],j+dy[k],k)。因为起始和终止的方向不确定,故再添加一个源点和一个汇点,源点向起始位置四个方向连边权为0的边,汇点向终止位置四个方向连边权为0的边,然后求源点到汇点的最短路即可。

爆搜代码

#include<bits/stdc++.h>
using namespace std;
int n,sx,sy,ex,ey,a[110][110];
char k;
bool book[110][110];
int ans=1<<30;
bool cheak(int x,int y){
    if(x<1||y>n||y<1||x>n||a[x][y]||book[x][y]) return false;
    else return true;
}
void dfs(int x,int y,int dir,int step){
    if(x==ex&&y==ey){
        ans=min(step,ans);
        return;
    }
    if(step>ans) return;
    if(dir){
        if(cheak(x+1,y)){
            book[x+1][y]=1;
            dfs(x+1,y,dir,step);
            book[x+1][y]=0;
        }
        if(cheak(x-1,y)){
            book[x-1][y]=1;
            dfs(x-1,y,dir,step);
            book[x-1][y]=0;
        }
        if(cheak(x,y+1)){
            book[x][y+1]=1;
            dfs(x,y+1,0,step+1);
            book[x][y+1]=0;
        }
        if(cheak(x,y-1)){
            book[x][y-1]=1;
            dfs(x,y-1,0,step+1);
            book[x][y-1]=0;
        }
    }
    else{
        if(cheak(x+1,y)){
            book[x+1][y]=1;
            dfs(x+1,y,1,step+1);
            book[x+1][y]=0;
        }
        if(cheak(x-1,y)){
            book[x-1][y]=1;
            dfs(x-1,y,1,step+1);
            book[x-1][y]=0;
        }
        if(cheak(x,y+1)){
            book[x][y+1]=1;
            dfs(x,y+1,dir,step);
            book[x][y+1]=0;
        }
        if(cheak(x,y-1)){
            book[x][y-1]=1;
            dfs(x,y-1,0,step);
            book[x][y-1]=0;
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            scanf("%c",&k);
            if(k=='A'){
                sx=i;
                sy=j;
            }
            else if(k=='B'){
                ex=i;
                ey=j;
            }
            else if(k=='x'){
                a[i][j]=1;
            }
            else if(k=='.'){
                a[i][j]=0;
            }
            else j--;
        }
    }
    dfs(sx,sy,0,0);
    dfs(sx,sy,1,0);
    if(ans==1<<30) printf("-1");
    else printf("%d",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/donkey2603089141/p/11416524.html

时间: 2024-10-30 02:26:18

[USACO07OCT]障碍路线 & yzoj P1130 拐弯 题解的相关文章

洛谷 P1649 [USACO07OCT]障碍路线Obstacle Course

P1649 [USACO07OCT]障碍路线Obstacle Course 题目描述 Consider an N x N (1 <= N <= 100) square field composed of 1 by 1 tiles. Some of these tiles are impassible by cows and are marked with an 'x' in this 5 by 5 field that is challenging to navigate: . . B x .

bzoj1644 / P1649 [USACO07OCT]障碍路线Obstacle Course

P1649 [USACO07OCT]障碍路线Obstacle Course bfs 直接上个bfs 注意luogu的题目和bzoj有不同(bzoj保证有解,还有输入格式不同). 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 #define pi pair<int,int> 7 #defin

[USACO07OCT]障碍路线Obstacle Course

题目描述 Consider an N x N (1 <= N <= 100) square field composed of 1 by 1 tiles. Some of these tiles are impassible by cows and are marked with an 'x' in this 5 by 5 field that is challenging to navigate: . . B x . . x x A . . . . x . . x . . . . . x .

[洛谷1649]障碍路线&lt;BFS&gt;

题目链接:https://www.luogu.org/problem/show?pid=1649 历经千辛万苦,我总算是把这个水题AC了,现在心里总觉得一万只草泥马在奔腾: 这是一道很明显的BFS,然后我也明显的看出来了 但是,我就是WA了很久很久,在调试第一个晚上后,我发现读入是存在空格的,而不是数据问题 然后第二个问题就是,BFS找到的第一个终点不一定就是最优的答案(当然第二个问题是我重新打了一次猛然发现之前没注意的一点) 注意到这两点,其实这道题就没难度了 然后这道题的处理需要注意一个地方

yzoj P1122 阶乘 题解

T组数据,给出N,求出N!最右边非零的数. 对于30%的数据,N <= 30,T<=10. 对于全部的数据,N <= 10^2009,T<=30. 一道数学题 解析 N!/(10^x)最后一位数字即是结果.10^x进行拆分,变成5^x* 2^x.怎么除以5^x呢,好办,乘的时候含有5的倍数的一项全部不乘进去,再递归此过程.即 1 2 3 4 (15) 6 7 8 9 (25) 11 12 13 14 (35)16 17 18 19 (45) 21 22 23 24 (55) 26

yzoj P2345 战争 题解

纯数论 30分:纯暴力,直接模拟判断t秒后,判断hp是否小于0 60分: atk>=h,就是一炮一个,那么军队会在min(n,t)秒之后停止攻击,那么总伤害就是a[n+(n-1) +(n-2)+........(n-min(n,t)+1) 等差数列求和d=a(2n-min(n,t)+1)*(min(n,t))/2; 如果d>=hp Yes,否则No: 100分 考虑前t秒军队伤害总和,然后和hp比较大小 先算几下打死一个士兵,设m下 那么前m秒伤害为nma m+1到2m秒伤害为m(n-1)a

yzoj P2371 爬山 题解

背景 其实 Kano 曾经到过由乃?,当然这名字?看?主就是 Yuno 嘛.当年 Kano 看见了由乃?,内?突然涌出了?股杜甫会当凌绝顶,?览众??的 豪?,于是毅然决定登?.但是 Kano 总是习惯性乱丢垃圾,增重环卫?? 的负担,Yuno 并不想让 Kano 登?,于是她果断在?上设置了结界-- 题意 Yuno 为了?便登?者,在?上造了 N 个营地,编号从 0 开始.当结界发动时,每当第 $ i(> 0) $ 号营地内有?,那么他将被传送到第 $ A_i (< i) $ 号营 地,如此

A*寻路算法所生成的路径

本文目的是对A*寻路算法所生成的路径进行一些人性化的调整,使其看起来不至于太机械化.关于A*算法的原理与实现,读者可以阅读其他资料,这里不再详细阐述. 如何写估价函数 A*寻路算法本质上是一个有方向性的广度优先搜索算法,它使用一个估价函数,来估测可能的最短路径,在每一次搜索迭代完成后,选取其邻接点中最优的一个(即,距离终点最近的一个点),作为下一次迭代的起点.如此反复,直到找到终点.下面先列出估价函数的常规写法: 设i点到起点的价值为S,到终点的估价为E,i点的总估价G等于S+E.S的值是确定的

BZOJ 1003: [ZJOI2006]物流运输trans DP+最短路

Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个码头会无法装卸货物.这时候就必须修改运输路线,让货物能够按时到达目的地.但是修改路线是一件十分麻烦的事情,会带来额外的成本.因此物流公司希望能够订一个n天的运输计划,使得总成本尽可能地小. Input 第一行是四个整数n(1<=n<=100).m(1&