首页 > 其他分享 >2023-10-28:用go语言,给定一个n*m的二维矩阵,每个位置都是字符, U、D、L、R表示传送带的位置,会被传送到 : 上、下、左、右, . 、O分别表示空地、目标,一定只有一个目标点, 可以

2023-10-28:用go语言,给定一个n*m的二维矩阵,每个位置都是字符, U、D、L、R表示传送带的位置,会被传送到 : 上、下、左、右, . 、O分别表示空地、目标,一定只有一个目标点, 可以

时间:2023-10-28 20:14:21浏览次数:42  
标签:10 mapData map int 28 2023 visited col row

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;
}

在这里插入图片描述

标签:10,mapData,map,int,28,2023,visited,col,row
From: https://www.cnblogs.com/moonfdd/p/17794524.html

相关文章

  • 28. 找出字符串中第一个匹配项的下标
    目录题目法一、KMP法二、切片法三、两行题目给你两个字符串 haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果 needle不是haystack的一部分,则返回 -1。示例1:输入:haystack="sadbutsad",needle="sad"......
  • 20231327 司宏林《计算机基础与程序设计》第5周学习总结
    学期(2023-2024-1)学号(20231327)《计算机基础与程序设计》第5周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2023-2024-1计算机基础与程序设计第5周作业)这个作业的目标<关于机器语......
  • P2514 [HAOI2010] 工厂选址 题解
    目录DescriptionSolutionCodeDescription有\(m\)座煤矿,每一座煤矿有\(a_i\)吨煤,第\(i\)座煤矿到第\(j\)号发电厂的运费为\(c_{i,j}\)每吨。有一座发电厂(标号为0),需要恰好\(b\)吨煤矿发电,初始运行费用为\(h\)。还有\(n\)座待运行的发电厂(标号为1~n),每座发电厂初......
  • 软考系列(系统架构师)- 2010年系统架构师软考案例分析考点
    试题一软件系统架构选择【问题1】(7分)在实际的软件项目开发中,采用恰当的架构风格是项目成功的保证。请用200字以内的文字说明什么是软件架构风格,并对主程序-子程序和管道-过滤器这两种架构风格的特点进行描述。软件架构风格是描述特定软件系统组织方式的惯用模式。组织方式描......
  • 2023寒鹭Tron-CTF迎新赛 CRYPTO Misc 全WP
    CRYPTO简简单单1、题目信息U2FsdGVkX1+2gTXPuTetdM1p+IETUDXAHe2eC33jQfgdJoOmmrJq2、解题方法兔子密码,在线工具直接解简简单单21、题目信息part1offlag:++++++++++[->++++++++++<]>++.++++++.<+++[->---<]>--.++++++.<++++[->++++<]>++++.-----......
  • 10.28每日总结
    最近几天心情不太好,想了很多事情,为什么要这么做,我真正想要什么,好像做什么也不对万幸的是,我还能找到答案:1.我们要有自己的思想,如果失败与错误需要反思,那么成功的经验也同样重要。2.人生想要什么就要学会自己努力去争取,因为畏惧失败或者恐惧现实,就把想法藏在心中,成为一个自欺欺人......
  • 2023-2024-1 20231329《计算机程序与设计》第五周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK05这个作业的目标计算机科学概论第6章并完成云班课测试《C语言程序设计》第4章并完成云班课测试......
  • 【Python数据可视化】2023中秋国庆电影票房数据
    ......
  • CSP-J 2023 题解
    CSP-J2023题解T1小苹果这个题直接遍历枚举必定TLE,这是CCF的出题风格,每题T1巨水无比,但是往往又需要一些思维。这道题我们可以发现每一轮操作都会拿走\(1+(n-1)/3\)个苹果,所以每次让\(n\)减去\(1+(n-1)/3\)就可以了。然后记录编号为\(n\)什么时候拿......
  • test20231028
    最小丑的一回(好像并不是)T1是个简单题,只要会高中基础几何就行了。T2看上去是个暴力,然后我也写了个暴力,结果跑大样例dfs进行到两万多层的时候RE了,完全不知道为什么,然后调调调调了一个多小时,到了十点放弃T2开始干T3。T3看起来是个数学题,然后退式子,推推推大概半个小时过......