我刚刚解决了一个编码任务,叫做“流明”。概括一下任务:在正方形数组中,将在随机索引中放置字母“ C”,代表蜡烛。最高的亮度“ L”(整数)将放置在字母“ C”的索引处,然后,必须计算所有相邻索引的亮度,直到L的值变为0。因此在索引arr [i] [ j]的亮度将设置为L,因为arr [i-1] [j]的所有组合均为L-1 ad,依此类推。 现在,在我的代码中,我有一个非常长的基于“ if”的计算,最大值为L = 3(在任务中,它变低而不变高)。 这是一些计算示例代码:
// CancelUploadWorkManager
class CancelUploadWorkManager(context: Context, params: WorkerParameters): CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
val position: Int = inputData.getInt(Constants.KEY_POSITION, 0)
val userId = inputData.getString(Constants.KEY_DIRECTORY)
val fileName = inputData.getString(Constants.KEY_FILE_NAME)
return try {
FirebaseManager().deleteAt(position = position, fileName = fileName!!,userId = userId!!)
Timber.i("Work Manager executed")
Result.success()
} catch (ex: Exception) {
Timber.e(ex)
Result.retry()
}
}
}
是否存在一种更好且更不容易出现错误的方式来执行这些计算?我在某处读到,从本质上讲,这是逆切比雪夫距离计算(max(| x1-x2 |,| y1-y2 |)。 如果是这样,是否有函数可以在C ++中对其进行计算?我进行了一些搜索,找到了python3和java的文档,但没有C ++的文档。 谢谢您的时间!
答案 0 :(得分:3)
首先找到蜡烛的索引,然后简单地遍历所有单元格:
int col, row;
for (int i = 0; i < N; ++i){
for (int j = 0; j < N; ++j){
if (map[i][j] == 'C') {
col = j;
row = i;
}
}
}
然后简单地遍历所有单元格,计算距离,然后计算亮度:
#include <cstdlib> // for std::abs
#include <algorithm> // for std::max
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
int distance = std::max(std::abs(i - row), std::abs(j - col));
luminance[i][j] = std::max(L - distance, 0);
}
}