对于一个电路系统中,给定若干个元器件和若干条导线,以及使用导线连接元器件的操作过程,如何判断操作完成后最终某个元器件是否在与电源相连的回路中?
实际对于该类问题,无需纠结导线的连接方式与所谓的“回路”,只需判断元器件是否间接或直接与电源正负极相连。
本文提出使用方阵存储元器件间连接状态。
即将每一个元器件以及电源的正负极,看为独立的点,即方阵的行和列;方阵初始为零方阵;
每做一次连接操作,则将方阵对应行列上的值标识为1。这一步是为了记录两个元器件间的连接状态。
然后再将两个元器件对应的两行元素做或运算(or-operation),即“有1取1,无1取0”,得到的结果替换掉这两行。这一步是为了传导元器件的连接状态,即实现“0与1连通,1与2连通,推导出0与2连通”。
完成若干轮操作后,取方阵的下三角部分再进行一次遍历:若行i和列j对应的两个元器件是连通状态,则取其对应的两行(即行i和行j)再做一次或运算。这一步是为了确保所有元器件的连接状态都完成了传导。
完整代码如下:
/**
* initial link rect
* @param component_num the number of components in electric system
* @returns two-dimensional array
*/
function init(component_num) {
rec = new Array(component_num)
for (let i = 0; i < component_num; i += 1) {
rec[i] = new Array(component_num)
rec[i].fill(0)
}
return rec
}
/**
* or operation for two lines
* @param line_1 the first line
* @param line_2 the second line
* @returns a one-dimensional array about the or-operation result between line_1 and line_2
*/
function or(line_1, line_2) {
return line_1.map((_, i) => line_1[i] | line_2[i])
}
/**
* mock link action
* @param rec the link rect
* @param begin the index of begin node
* @param end the index of end node
* @returns
*/
function mockLn (rec, begin, end) {
let x = begin > end ? begin : end
let y = begin > end ? end : begin
rec[x][y] = 1
rec[x] = rec[y] = or(rec[x], rec[y])
}
/**
* the final check of one circle, in order to find the omissive point
* @param rec the link rect
* @returns
*/
function finalCheck(rec) {
for (let i = 0; i < rec.length; i += 1) {
for (let j = 0; j < i; j += 1) {
if (rec[i][j]) rec[i] = rec[j] = or(rec[i], rec[j])
}
}
}
/** main */
(function (...args) {
let ln_rec = init(6)
console.info("============== following initialization rect ===============")
console.info(ln_rec)
console.info("============== rect initialization complete ================")
mockLn(ln_rec, 0, 2)
mockLn(ln_rec, 1, 3)
mockLn(ln_rec, 2, 3)
mockLn(ln_rec, 4, 5)
finalCheck(ln_rec)
console.info("============== result rect ===============")
console.info(ln_rec)
console.info("============== result rect ===============")
})()
标签:连通,ln,param,算法,元器件,rec,line,方阵,rect
From: https://www.cnblogs.com/seal-sill/p/18280991