首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

2023-10-28:用go语言,给定一个n*m的二维矩阵,每个位置都是字符, U、D、L、R表示传送带的位置,会被传送到 :

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?

visited[i]?=?make([]bool,?m)

}

for?i?:=?0;?i?

for?j?:=?0;?j?

if?dfs(mapData,?i,?j,?visited)?{

ans++

}

}

}

return?ans

}

//?暴力方法

func?dfs(mapData?[][]byte,?i,?j?int,?visited?[][]bool)?bool?{

if?i?

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?

visited[i]?=?make([]bool,?m)

}

queue?:=?make([][2]int,?n*m)

l?:=?0

r?:=?0

ans?:=?0

for?i?:=?0;?i?

for?j?:=?0;?j?

if?mapData[i][j]?==?'O'?{

visited[i][j]?=?true

queue[r][0]?=?i

queue[r][1]?=?j

r++

break

}

}

}

for?l?

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?

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?

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?

mapData[i]?=?make([]byte,?m)

for?j?:=?0;?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?

mapData?:=?generateRandomMap(n,?m)

ans1?:=?number1(mapData)

ans2?:=?number2(mapData)

if?ans1?!=?ans2?{

fmt.Println("出错了!")

}

}

fmt.Println("测试结束")

}

在这里插入图片描述c++完整代码如下:

#include?

#include?

#include?

#include?

#include?

using?namespace?std;

bool?dfs(vector&?map,?int?i,?int?j,?vector&?visited);

vector?generateRandomMap(int?n,?int?m);

//?暴力方法

int?number1(vector&?map)?{

int?ans?=?0;

int?n?=?map.size();

int?m?=?map[0].size();

vector?visited(n,?vector(m,?false));

for?(int?i?=?0;?i?

for?(int?j?=?0;?j?

if?(dfs(map,?i,?j,?visited))?{

ans++;

}

}

}

return?ans;

}

//?暴力方法

bool?dfs(vector&?map,?int?i,?int?j,?vector&?visited)?{

if?(i?

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&?map)?{

int?n?=?map.size();

int?m?=?map[0].size();

vector?visited(n,?vector(m,?false));

vector?queue(n?*?m);

int?l?=?0;

int?r?=?0;

int?ans?=?0;

//?O在哪,目的地

for?(int?i?=?0;?i?

for?(int?j?=?0;?j?

if?(map[i][j]?==?'O')?{

visited[i][j]?=?true;

queue[r++]?=?make_pair(i,?j);

break;

}

}

}

//?[]?[]?[]?[]?[]?...

//?l?......?r

while?(l?

ans++;

pair?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?

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?

visited[row][col?+?1]?=?true;

queue[r++]?=?make_pair(row,?col?+?1);

}

}

return?ans;

}

//?生成随机地图

vector?generateRandomMap(int?n,?int?m)?{

vector?map(n,?vector(m));

srand(time(0));

for?(int?i?=?0;?i?

for?(int?j?=?0;?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?

for?(int?i?=?0;?i?

vector?map?=?generateRandomMap(n,?m);

int?ans1?=?number1(map);

int?ans2?=?number2(map);

if?(ans1?!=?ans2)?{

cout?

}

}

cout?

return?0;

}

在这里插入图片描述

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OW-OxT1fkeQh1j2Rsvqw-aNQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com