2023-10-28:用go语言,给定一个n*m的二维矩阵,每个位置都是字符, U、D、L、R表示传送带的位置,会被传送到 : 上、下、左、右, . 、O分别表示空地、目标,一定只有一个目标点, 可以
2023-10-28:用go语言,给定一个n*m的二维矩阵,每个位置都是字符,
U、D、L、R表示传送带的位置,会被传送到 : 上、下、左、右,
. 、O分别表示空地、目标,一定只有一个目标点,
可以在空地上选择上、下、左、右四个方向的一个,
到达传送带的点会被强制移动到其指向的下一个位置。
如果越界直接结束,返回有几个点可以到达O点。
来自左程云。
答案2023-10-28:
go代码用chatgpt编写,不需要修改。
c++代码用讯飞星火编写,略有改动。
大体步骤如下:
首先,代码定义了两个函数number1和number2,它们都接受一个二维矩阵作为输入,并返回一个整数,表示可以到达目标点O的点的数量。这两个函数的主要区别在于它们的搜索策略不同。number1使用深度优先搜索(DFS)策略,而number2使用广度优先搜索(BFS)策略。
在number1函数中,首先初始化一个与输入矩阵大小相同的visited矩阵,用于记录每个位置是否已经被访问过。然后,遍历输入矩阵,找到第一个目标点O,将其位置添加到队列queue中,并将visited对应位置设为true。接下来,从队列中取出一个位置,如果该位置是目标点O,则计数器ans加1;否则,检查该位置的上下左右四个相邻位置,如果相邻位置在矩阵范围内且未被访问过,则将其添加到队列中,并将visited对应位置设为true。重复这个过程,直到队列为空。最后,返回计数器ans的值。
在number2函数中,同样首先初始化一个与输入矩阵大小相同的visited矩阵,用于记录每个位置是否已经被访问过。然后,遍历输入矩阵,找到第一个目标点O,将其位置添加到队列queue中,并将visited对应位置设为true。接下来,从队列中取出一个位置,如果该位置是目标点O,则计数器ans加1;否则,检查该位置的上下左右四个相邻位置,如果相邻位置在矩阵范围内且未被访问过,则将其添加到队列中,并将visited对应位置设为true。重复这个过程,直到队列为空。最后,返回计数器ans的值。
generateRandomMap函数用于生成一个随机的nm二维矩阵,其中包含字符U、D、L、R、.和O。它首先创建一个大小为nm的二维数组mapData,然后遍历这个数组,对于每个位置,随机选择一个字符填充。最后,将一个随机位置设置为字符O。
在main函数中,首先设置随机数种子,然后进行多次测试。每次测试,调用generateRandomMap函数生成一个随机矩阵,然后分别调用number1和number2函数计算可以到达目标点O的点的数量,如果两者的结果不相等,则输出出错信息。最后,输出测试结束的信息。
总的时间复杂度为O(nm),因为需要遍历整个矩阵。总的额外空间复杂度为O(nm),因为需要存储visited矩阵和队列queue。
go完整代码如下:
package main
import (
"fmt"
"math/rand"
"time"
)
// 暴力方法
func number1(mapData [][]byte) int {
ans := 0
n := len(mapData)
m := len(mapData[0])
visited := make([][]bool, n)
for i := 0; i < n; i++ {
visited[i] = make([]bool, m)
}
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
if dfs(mapData, i, j, visited) {
ans++
}
}
}
return ans
}
// 暴力方法
func dfs(mapData [][]byte, i, j int, visited [][]bool) bool {
if i < 0 || i == len(mapData) || j < 0 || j == len(mapData[0]) || visited[i][j] {
return false
}
visited[i][j] = true
ans := false
if mapData[i][j] == 'O' {
ans = true
} else {
if mapData[i][j] == 'U' {
ans = dfs(mapData, i-1, j, visited)
} else if mapData[i][j] == 'D' {
ans = dfs(mapData, i+1, j, visited)
} else if mapData[i][j] == 'L' {
ans = dfs(mapData, i, j-1, visited)
} else if mapData[i][j] == 'R' {
ans = dfs(mapData, i, j+1, visited)
} else {
ans = dfs(mapData, i-1, j, visited) || dfs(mapData, i+1, j, visited) || dfs(mapData, i, j-1, visited) || dfs(mapData, i, j+1, visited)
}
}
visited[i][j] = false
return ans
}
// 正式方法
func number2(mapData [][]byte) int {
n := len(mapData)
m := len(mapData[0])
visited := make([][]bool, n)
for i := 0; i < n; i++ {
visited[i] = make([]bool, m)
}
queue := make([][2]int, n*m)
l := 0
r := 0
ans := 0
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
if mapData[i][j] == 'O' {
visited[i][j] = true
queue[r][0] = i
queue[r][1] = j
r++
break
}
}
}
for l < r {
ans++
cur := queue[l]
row := cur[0]
col := cur[1]
if row-1 >= 0 && !visited[row-1][col] && (mapData[row-1][col] == 'D' || mapData[row-1][col] == '.') {
visited[row-1][col] = true
queue[r][0] = row - 1
queue[r][1] = col
r++
}
if row+1 < n && !visited[row+1][col] && (mapData[row+1][col] == 'U' || mapData[row+1][col] == '.') {
visited[row+1][col] = true
queue[r][0] = row + 1
queue[r][1] = col
r++
}
if col-1 >= 0 && !visited[row][col-1] && (mapData[row][col-1] == 'R' || mapData[row][col-1] == '.') {
visited[row][col-1] = true
queue[r][0] = row
queue[r][1] = col - 1
r++
}
if col+1 < m && !visited[row][col+1] && (mapData[row][col+1] == 'L' || mapData[row][col+1] == '.') {
visited[row][col+1] = true
queue[r][0] = row
queue[r][1] = col + 1
r++
}
l++
}
return ans
}
// 生成随机地图
func generateRandomMap(n, m int) [][]byte {
mapData := make([][]byte, n)
for i := 0; i < n; i++ {
mapData[i] = make([]byte, m)
for j := 0; j < m; j++ {
r := rand.Intn(5)
if r == 0 {
mapData[i][j] = 'U'
} else if r == 1 {
mapData[i][j] = 'D'
} else if r == 2 {
mapData[i][j] = 'L'
} else if r == 3 {
mapData[i][j] = 'R'
} else {
mapData[i][j] = '.'
}
}
}
mapData[rand.Intn(n)][rand.Intn(m)] = 'O'
return mapData
}
func main() {
rand.Seed(time.Now().UnixMicro())
n := 10
m := 10
testTimes := 10000
fmt.Println("测试开始")
for i := 0; i < testTimes; i++ {
mapData := generateRandomMap(n, m)
ans1 := number1(mapData)
ans2 := number2(mapData)
if ans1 != ans2 {
fmt.Println("出错了!")
}
}
fmt.Println("测试结束")
}

c++完整代码如下:
#include <iostream>
#include <vector>
#include <queue>
#include <cstdlib>
#include <ctime>
using namespace std;
bool dfs(vector<vector<char>>& map, int i, int j, vector<vector<bool>>& visited);
vector<vector<char>> generateRandomMap(int n, int m);
// 暴力方法
int number1(vector<vector<char>>& map) {
int ans = 0;
int n = map.size();
int m = map[0].size();
vector<vector<bool>> visited(n, vector<bool>(m, false));
for (int i = 0; i < map.size(); i++) {
for (int j = 0; j < map[0].size(); j++) {
if (dfs(map, i, j, visited)) {
ans++;
}
}
}
return ans;
}
// 暴力方法
bool dfs(vector<vector<char>>& map, int i, int j, vector<vector<bool>>& visited) {
if (i < 0 || i == map.size() || j < 0 || j == map[0].size() || visited[i][j]) {
return false;
}
visited[i][j] = true;
bool ans = false;
if (map[i][j] == 'O') {
ans = true;
}
else {
if (map[i][j] == 'U') {
ans = dfs(map, i - 1, j, visited);
}
else if (map[i][j] == 'D') {
ans = dfs(map, i + 1, j, visited);
}
else if (map[i][j] == 'L') {
ans = dfs(map, i, j - 1, visited);
}
else if (map[i][j] == 'R') {
ans = dfs(map, i, j + 1, visited);
}
else {
ans = dfs(map, i - 1, j, visited) || dfs(map, i + 1, j, visited) || dfs(map, i, j - 1, visited)
|| dfs(map, i, j + 1, visited);
}
}
visited[i][j] = false;
return ans;
}
// 正式方法
int number2(vector<vector<char>>& map) {
int n = map.size();
int m = map[0].size();
vector<vector<bool>> visited(n, vector<bool>(m, false));
vector<pair<int, int>> queue(n * m);
int l = 0;
int r = 0;
int ans = 0;
// O在哪,目的地
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (map[i][j] == 'O') {
visited[i][j] = true;
queue[r++] = make_pair(i, j);
break;
}
}
}
// [] [] [] [] [] ...
// l ...... r
while (l < r) { // 队列里还有位置!
ans++;
pair<int, int> cur = queue[l++];
int row = cur.first;
int col = cur.second;
if (row - 1 >= 0 && !visited[row - 1][col] && (map[row - 1][col] == 'D' || map[row - 1][col] == '.')) {
visited[row - 1][col] = true;
queue[r++] = make_pair(row - 1, col);
}
if (row + 1 < n && !visited[row + 1][col] && (map[row + 1][col] == 'U' || map[row + 1][col] == '.')) {
visited[row + 1][col] = true;
queue[r++] = make_pair(row + 1, col);
}
if (col - 1 >= 0 && !visited[row][col - 1] && (map[row][col - 1] == 'R' || map[row][col - 1] == '.')) {
visited[row][col - 1] = true;
queue[r++] = make_pair(row, col - 1);
}
if (col + 1 < m && !visited[row][col + 1] && (map[row][col + 1] == 'L' || map[row][col + 1] == '.')) {
visited[row][col + 1] = true;
queue[r++] = make_pair(row, col + 1);
}
}
return ans;
}
// 生成随机地图
vector<vector<char>> generateRandomMap(int n, int m) {
vector<vector<char>> map(n, vector<char>(m));
srand(time(0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int r = rand() % 5;
if (r == 0) {
map[i][j] = 'U';
}
else if (r == 1) {
map[i][j] = 'D';
}
else if (r == 2) {
map[i][j] = 'L';
}
else if (r == 3) {
map[i][j] = 'R';
}
else {
map[i][j] = '.';
}
}
}
map[rand() % n][rand() % m] = 'O';
return map;
}
// 为了测试
int main() {
int n = 10;
int m = 10;
int testTimes = 1000;
cout << ("测试开始") << endl;
for (int i = 0; i < testTimes; i++) {
vector<vector<char>> map = generateRandomMap(n, m);
int ans1 = number1(map);
int ans2 = number2(map);
if (ans1 != ans2) {
cout << ("出错了!") << endl;
}
}
cout << ("测试结束") << endl;
return 0;
}

2023-10-28:用go语言,给定一个n*m的二维矩阵,每个位置都是字符, U、D、L、R表示传送带的位置,会被传送到 : 上、下、左、右, . 、O分别表示空地、目标,一定只有一个目标点, 可以的更多相关文章
- 旋转图像 给定一个 n × n 的二维矩阵表示一个图像。
给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 : 给定 ma ...
- js实现Mac触摸板双指事件(上/下/左/右/放大/缩小)
前言 这几天在修复一个web问题时,需要捕获Mac触摸板双指事件(上.下.左.右.放大.缩小),但发现并没有现成的轮子,还是要自己造. 例如:jquery.mousewheel.js(添加跨浏览器的鼠 ...
- 【leetcode-03】给定一个字符串,请你找出其中不含有重复字符的最长子串的长度
开个新坑,leetcode上面做题目.下面是题目描述: <!-- 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出 ...
- [LeetCode] Search a 2D Matrix II 搜索一个二维矩阵之二
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- [LeetCode] 240. Search a 2D Matrix II 搜索一个二维矩阵 II
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- [LeetCode] Search a 2D Matrix 搜索一个二维矩阵
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- [LeetCode] 74. Search a 2D Matrix 搜索一个二维矩阵
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)
问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10 分析: 2*2子数组的最大和.遍历求和,时 ...
- 用Python+qrcode库创建一个包含信息的二维码
安装qrcode库和PIL库 在命令行中分别输入pip install qrcode 和pip install pillow 导入库格式如下: import PIL import qrcode 下面以 ...
- [CareerCup] 11.6 Search a 2D Matrix 搜索一个二维矩阵
11.6 Given an M x N matrix in which each row and each column is sorted in ascending order, write a m ...
随机推荐
- 基于Spring事件驱动模式实现业务解耦
事件驱动模式 举个例子 大部分软件或者APP都有会有会员系统,当我们注册为会员时,商家一般会把我们拉入会员群.给我们发优惠券.推送欢迎语什么的. 值得注意的是: 注册成功后才会产生后面的这些动作: 注 ...
- ProcessingJS
ProcessingJS 图形 rect(x, y, w, h)(在新窗口中打开) ellipse(x, y, w, h) triangle(x1, y1, x2, y2, x3, y3) line( ...
- 高可用mongodb集群(分片+副本):性能测试
目录 ■ 为指定的库和表指定hash分片 ■ 测试模型,即workload模型 ■ 测试指标 ■ workload_s6 ■ 分片集群性能测试数据统计分析 ■ 测试结论 Yahoo! Cloud Se ...
- 4款.NET开源的Redis客户端驱动库
前言 今天给大家推荐4款.NET开源免费的Redis客户端驱动库(以下排名不分先后). Redis是什么? Redis全称是REmote DIctionary Service,即远程字典服务.Redi ...
- go defer简介
思考 开始之前,先考虑下下面的代码的执行结果: package main import "fmt" func test() int { i := 0 defer func() { ...
- liunx知识点--umask
介绍 umask(user's mask)用来设置文件权限掩码.权限掩码是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限. UNIX最初实现时不包含umask命 ...
- 轻松掌握组件启动之MongoDB:快速入门、Linux安装和Docker配置指南
引言 我们将继续深入研究组件启动专题.在之前的文章中,我们已经详细介绍了Redis的各种配置使用方法,为读者提供了全面的指导.然而,今天我们将转向另一个备受关注的数据库--MongoDB.MongoD ...
- DS18B20初始化-读-写-温度转换
DS18B20 (一)初始化 (二)读字节 (三)写字节 (四)温度转换 1获得数据 2转换数据 (一)初始化 初始化时序: 数据线先拉到高电平,稍作延时即可(刚开始是高电平还是低电平芯片手册上其实不 ...
- [C++]线段树 区间查询 单点修改
线段树 区间查询 单点修改 算法思想 这个算法是用于数组的查询和修改 可以高效的进行查询修改 但是会增加内存的使用 本质上是一种 空间换时间 的算法 这个算法把一串数组无限二分 直到分的只剩下一个数据 ...
- 题解 UVA10299
前言 数学符号约定: \(a\).\(b\).\(m\).\(n\).\(x\).\(y\):任意一个正整数. \(p\):任意一个质数. \(d\):一个数的任意一个因子. \(\varphi(n) ...