- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我们想在一个特殊的网格中找到两点之间的最短路径。我们可以一次在相邻的方格之间移动,但我们也可以一次移动在相同类型的单元格(有 10 种类型)之间移动,无论它们之间的距离有多远。
对于最大 100x100 的网格,我们如何找到在两点之间行进所需的步数?
最佳答案
我在比赛中使用 BFS 解决了这个问题。
问题可以建模为图形。每个单元格都是一个节点,并且与每个相邻单元格都有一条边。我们可以通过根据需要计算网格坐标来访问每个单元格及其相邻单元格,而不是显式构建图形,从而简单地保持图形隐式。
每个单元格也有一条到所有相同颜色单元格的边。我们可以通过保留每种颜色的单元格列表并访问与当前单元格颜色相同的所有单元格来将其添加到我们的图形中。
Dijkstra 或 A* 之类的东西可以工作(毕竟它们本质上是一个具有优先级队列/启发式的 BFS),但为这样一个简单的问题实现它会严重矫枉过正。
代码如下(C++):
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
char grid[101][101];
int cost[101][101];
vector<pair<int,int> > colour[10]; // lists of same coloured cells
//used to compute adjacent cells
int dr[]={ 0, 0, 1,-1};
int dc[]={ 1,-1, 0,0};
int rows,cols; // total rows and coloumns
int bfs(pair<int,int> start){
memset(cost,-1,sizeof(cost)); // all unvisited nodes have negative cost to mark them
cost[start.first][start.second]=0; // start node has cost 0
queue<pair<int,int> > Q;
Q.push(start);
while (!Q.empty()){
pair<int,int> node=Q.front();Q.pop();
int r=node.first;
int c=node.second;
int cst=cost[r][c];
if (grid[r][c]=='E'){
return cst;
}
// search adjacent cells
for(int i=0;i<4;i++){
int nr=r+dr[i];
int nc=c+dc[i];
if (nr>=0 && nr<rows && nc>=0 && nc<cols && cost[nr][nc]<0 && grid[nr][nc]!='W'){
cost[nr][nc]=cst+1;
Q.push(make_pair(nr,nc));
}
}
// search cells of the same colour
if (grid[r][c]>='1' && grid[r][c]<='9'){
vector<pair<int,int> > &trans=colour[grid[r][c]-'0'];
for(int i=0;i<trans.size();i++){
pair<int,int> next=trans[i];
if (cost[next.first][next.second]<0){
cost[next.first][next.second]=cst+1;
Q.push(next);
}
}
}
}
return -1;
}
int main(){
int N;
cin>>N;
while(N--){
cerr<<"cases left"<<N<<endl;
cin>>rows>>cols;
pair<int,int> start;
for(int i=0;i<10;i++) colour[i].clear();
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
cin>>grid[i][j];
if (grid[i][j]=='S'){
start=make_pair(i,j);
}
else if (grid[i][j]>='1' && grid[i][j]<='9'){
colour[grid[i][j]-'0'].push_back(make_pair(i,j));
}
}
}
cout<<bfs(start)<<"\n";
}
return 0;
}
关于algorithm - Facebook 黑客杯 : After the Dance Battle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4701330/
所以我是 C++ 的新手,我目前正在为一项任务开发一个“死亡之战”游戏,但我被卡住了。 基本上,作为玩家,您可以使用每种武器一定次数:Canon 3 次,Grenade 4 次。步枪是无限的。 当我使
下面的代码是为“武器游戏(NOV19B-SC31)”编写的。经过多次尝试,我观察到的问题是代码中的“battle”函数能够读取但不能更改字符串中的单个字符。 从下面的代码,“res”值不会根据代码中提
我目前正在学习 Udemy 的 Vue.js 教程。我已经到达您正在构建战斗网络应用游戏的部分。完成后,我决定练习我的重构并遇到了这个错误。 当你点击攻击按钮然后出现确认框询问你是否要再次玩时,它似乎
我正在尝试创建一个类似 http://us.battle.net/en/ 的登录系统.该页面功能齐全,然后当您单击“登录”链接时,页面变暗,您无法再与原始页面中的任何图像或链接进行交互。出现一个方框,
我们想在一个特殊的网格中找到两点之间的最短路径。我们可以一次在相邻的方格之间移动,但我们也可以一次移动在相同类型的单元格(有 10 种类型)之间移动,无论它们之间的距离有多远。 对于最大 100x10
我有这个代码: import GameKit class Battle: UIViewController, GKMatchmakerViewControllerDelegate { func hos
我正在尝试使用任意阶的 Battle-Lemarié 样条小波通过离散小波变换 (DWT) 来分析一些数据。该分析将用于二维图像去噪,计算一阶和二阶导数,并从每个小波尺度中提取相关信息。由于我不是数学
相信坦克大战大家都玩过吧,本题就是根据这个游戏设计的。坦克要从起点(Y),到目的地(T),坦克不能通过钢墙(S),河(R),可以在空地在行走(E),射击破坏砖墙(B),射击砖墙时不行走且花费一个单位
所以我刚刚从 ubuntu 切换到 mac,设置 env 并不像 promise 的那么容易。 这是我遵循的过程。 安装 xcode - 然后进入首选项并下载命令行工具 然后通过运行 gcc --ve
我正在尝试让两个怪物战斗并返回一个怪物获胜者。我尝试加入一个 while 循环,让怪物互相攻击 public class Bat{ public static void main (Strin
到目前为止,游戏以纵向加载:所以主菜单是纵向的,然后游戏世界(玩家角色在其中漫游的地方)也是纵向的。但是我需要在角色开始战斗时将方向更改为横向模式(另外,当玩家在战斗模式下转动手机时,我不希望手机改变
我正在制作一个网络游戏(1v1),在游戏中它是 p2p - 不需要游戏服务器。 但是,为了让玩家能够“找到彼此”,而不需要在其他媒体中协调并输入IP地址(类似于现代网络游戏),我需要一个协调/匹配服务
我是一名优秀的程序员,十分优秀!