胖胖的牛牛

2023-10-20 03:08
文章标签 牛牛 胖胖的

本文主要是介绍胖胖的牛牛,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目地址

链接:https://ac.nowcoder.com/acm/problem/208246
来源:牛客网

题目

每逢佳节胖三斤,牛牛在过去的节日里长胖了,连拐弯都困难,甚至会卡在门上,所以他很讨厌拐弯。给你一个N*N(2≤N≤100)的方格中,‘x’表示障碍,‘.’表示没有障碍(可以走),牛牛可以从一个格子走到他相邻的四个格子,但是不能走出这些格子。问牛牛从A点到B点最少需要转90度的弯几次。

思路:
①把最少拐弯次数看成最短路问题,用求最短路的方法求就行了
②注意到达一个的拐弯次数可能一样,但由于方向问题,会导致到终点的拐弯次数是不一样的,而且一个点最多被上下或者左右两种方向的最短拐弯路径经过,所以要允许一个点至少被2次以同样的最短拐弯数走过。

方法1
dfs+记忆化+回溯

#include<bits/stdc++.h>
using namespace std;
#define ios std::ios::sync_with_stdio(false);
char graph[120][120];
int vis[120][120];
int flag[120][120];
int ax,ay,bx,by;
int run[5][2] = {{1,1},{1,0},{-1,0},{0,1},{0,-1}};
int n;
int sum = 0x3f3f3f3f;
bool right_index(int x,int y){return 0<= x  && x < n && 0 <= y && y < n ;
}void dfs(int x,int y,int time,int statue){if(graph[x][y] == 'B')sum = min(sum,time);if(vis[x][y] && time > vis[x][y])return ;//cout << x << " " << y << endl;vis[x][y] = time;int x1,y1;for(int i = 1;i <= 4;i++){x1 = x + run[i][0];y1 = y + run[i][1];if(!right_index(x1,y1) || graph[x1][y1] == 'x'|| flag[x1][y1])continue;if(statue == -1 || (statue - 1)/2 == (i-1)/2){//如果是起点,或者同向flag[x1][y1] = 1;dfs(x1,y1,time,i);flag[x1][y1] = 0;}else{flag[x1][y1] = 1;dfs(x1,y1,time+1,i);flag[x1][y1] = 0;}}return ;
}int main(){ioscin >> n;for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){cin >> graph[i][j];}}for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){if(graph[i][j] == 'A')ax = i,ay = j;}}dfs(ax,ay,0,-1);if(sum >= 0x3f3f3f3f)cout << -1 ;else cout << sum <<endl;return 0;
}

方法2
dijsktra + 优先队列

#include<bits/stdc++.h>
using namespace std;
const int MAX = 200;
char graph[MAX][MAX];
int vis[MAX][MAX];
bool flag[MAX][MAX];
int ax,ay,bx,by;
int run[5][2] = {{1,1},{0,1},{1,0},{-1,0},{0,-1}};
int n;struct point{int x, y,w,to,cnt;//x,y,转弯次数,方向,那一次入队bool operator < (const point &ty) const {if(w == ty.w)return cnt < ty.cnt;return w > ty.w;}
};priority_queue<point> q;bool right_index(int x,int y){return 0<= x  && x < n && 0 <= y && y < n;
}void bfs(int x,int y){point t,t1;int x1,y1; int count = 0;t.x = x;t.y = y;t.to = t.w = t.cnt = 0;vis[x][y] = 0;q.push(t);while(!q.empty()){t = q.top();q.pop();flag[t.x][t.y] = 1;count++;for(int i = 1;i <=4;i++){x1 = t.x + run[i][0];y1 = t.y + run[i][1];if(!right_index(x1,y1) || flag[x1][y1] || graph[x1][y1] == 'x' || vis[x1][y1] < vis[t.x][t.y])continue;//cout << x1 << " " << y1 << " " << t.to << " " << i << endl;if(!t.to || t.to + i == 5 || t.to == i)t1.w = vis[x1][y1] =  vis[t.x][t.y];else t1.w = vis[x1][y1] = min(vis[x1][y1],vis[t.x][t.y] + 1) ;t1.to = i;t1.x = x1;t1.y = y1;t1.cnt = count;q.push(t1);}}return ;
}int main(){memset(vis,0x3f,sizeof(vis));cin >> n;for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){cin >> graph[i][j];}}for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){if(graph[i][j] == 'A')ax = i,ay = j;if(graph[i][j] == 'B')bx = i,by = j;}}bfs(ax,ay);/*for(int i = 0;i < n;i++){for(int j = 0;j < n;j++)cout << vis[i][j] << " ";cout << endl;}*/if(vis[bx][by] >= 0x3f3f3f3f)cout << -1 ;else cout << vis[bx][by] << endl;//system("pause");return 0;
}

这篇关于胖胖的牛牛的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/244195

相关文章

【练习4】牛牛的快递

地址:牛牛的快递_牛客题霸_牛客网 (nowcoder.com) 分析: 先判断是否超出1kg,再判断是否加急。 其中Math.ceil(num)可以实现超出部分不足1kg按1kg计算。 public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);//定义

牛牛替换(c语言)

1.//描述 //牛牛有一个长度为 n 的字符数组,他尝试把字符数组中其中一些字符替换成另一些字符。 //输入描述: //第一行输入一个正整数 n 表示字符数组的长度,四个个字符分别 a1 和 a2 , a3 和 a4, // 表示把字符数组中 a1 全部替换成 a2,然后把 a3 全部替换成 a4(包括a1替换后产生的a2等于a3的情况) //第二行输入一个长度为 n 的字符数组。 //输出描述

帝国cms精仿牛牛书城小说网站模板

wap模板已经内置,自己新建m目录绑定即可。 模板安装方法:建议php7.3+,重新安装,恢复数据,用户名 密码 757xs.com 帝国cms精仿牛牛书城小说网站模板

牛客网-牛牛找工作

链接:https://www.nowcoder.com/questionTerminal/46e837a4ea9144f5ad2021658cb54c4d 时间限制:2秒 空间限制:65536K 为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下, 牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依

J 牛牛想要成为hacker

链接:https://ac.nowcoder.com/acm/contest/9982/J 来源:牛客网 在算法竞赛中"hack"一般指用一组测试数据触发程序的缺陷,从而导致本来通过题目的AC代码无法通过该测试数据。 一般情况见得比较多的是用hack数据导致别人WA掉,当然也有一些会导致原本的AC代码TLE和MLE。 牛牛在一些简单的练习题时遇到了这样一个问题。 给定一个大小为n的数组(1≤a

【题解】NowCoder BC64 牛牛的快递

题目来源:牛客 BC64 牛牛的快递 题目描述: 牛牛正在寄快递,他了解到快递在 1kg 以内的按起步价 20 元计算,超出部分按每 kg 1元计算,不足 1kg 部分按 1kg计算。如果加急的话要额外付五元,请问牛牛总共要支付多少快递费。 输入描述: 第一行输入一个单精度浮点数 a 和一个字符 b ,a 表示牛牛要寄的快递的重量,b表示牛牛是否选择加急,‘y’ 表示加急 ,‘n’ 表示

【笔试强训】牛牛快递

链接:牛牛的快递_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/41b42e7b3c3547e3acf8e90c41d98270?tpId=290&tqId=39852&ru=/exam/oj描述 牛牛正在寄快递,他了解到快递在 1kg 以内的按起步价 20 元计算,超出部分按每 kg 1元计算,不足 1kg 部分按 1kg计算

[分享]牛牛截图控件最终版

牛牛截图控件已经提供Web控件及标准的Javascript接口,测试程序及调用示例请访问: http://www.ggniu.cn/ 实现牛牛截图控件的初衷,是想在学习的同时,实现一个具备当前主流截图功能的插件,方便集成进不同的应用系统中,节省开发时间。 一直以来,都对目前各主流即时通讯软件的截图效果比较喜欢,前段时间专门花时间进行了一些研究,实现了自己的一个截图控件,我给它取

牛牛数数 【线性基+二分】

链接:https://ac.nowcoder.com/acm/contest/10845/E 来源:牛客网 保证答案在long long内。 解法 这题可以说是线性基的模板题。先学习一下线性基: 线性基视频 处理完线性基之后,就可以使用其性质4: 求任意子集xor最大值: 把线性基中所有元素xor起来求任意子集xor最小值: 等于最小的主元查询x是否在值域中: 如果x能插入线性基,则x

【NC212914】牛牛与后缀表达式

题目 牛牛与后缀表达式 栈 思路 栈基本问题:表达式求值 设置一个栈,当读入的 t o k e n token token 是操作数时,就将其转化为数字并入栈,如果是运算符,则将栈顶的两个操作数出栈后进行运算再入栈(如果是合法的表达式的话在调用运算符的时候栈中一定有大于等于两个的操作数存在),最后,栈中只会存在一个数字,这个数字就是表达式的计算结果。 代码 class