项目:人体扫描仪,ACM 1993

项目:人体扫描仪,ACM 1993,c,arrays,algorithm,tomography-reconstruction,C,Arrays,Algorithm,Tomography Reconstruction,我要为我的大学做一个相当困难的项目。这是一个人体扫描仪,这个概念是基于,扫描仪 请看图片以了解问题 所以,说到我们的观点。我需要您的帮助来制作一个算法,该算法获取数据输入的数字,并根据这些数字生成一个表(在本例中为10x15)。前10个数字表示每行(1)中非白细胞的数量。接下来的24个参数是从左到右对角线(2)中非白细胞的数量。接下来的15个是每列中非白色单元格的数量(3),最后的24个是从右到左对角线中非白色单元格的数量(4)。我一直在想一种算法,它可以组合所有这些数据并创建数组,但没有结

我要为我的大学做一个相当困难的项目。这是一个人体扫描仪,这个概念是基于,扫描仪

请看图片以了解问题


所以,说到我们的观点。我需要您的帮助来制作一个算法,该算法获取数据输入的数字,并根据这些数字生成一个表(在本例中为10x15)。前10个数字表示每行(1)中非白细胞的数量。接下来的24个参数是从左到右对角线(2)中非白细胞的数量。接下来的15个是每列中非白色单元格的数量(3),最后的24个是从右到左对角线中非白色单元格的数量(4)。我一直在想一种算法,它可以组合所有这些数据并创建数组,但没有结果。

行和列都很简单。它们只是x或y坐标

游戏正在检测对角线

如果你仔细想一想,这并不难

考虑:

a
ba
cba
dcba
edcba
通过一点研究,你可以看到细胞和对角线之间的关系

但是桌子的另一半呢

考虑这一点:

a
ba
cba
dcba
-----
edcba
fedcb
gfedc
hgfed
ihgfe
-----
 ihgf
  ihg
   ih
    i
这些线是表格的边界,但您可以看到对角线仅从表格的“外部”投影。因此,一旦你能解决基本问题(桌上的问题),可以说“把你的桌子弄大”。例如,要找出右上角“a”的对角线,您很可能最终得到的“对角线数”是,哦,-4或-5(类似的东西)。只需将其向后移动(即添加4或5)与其余部分一起,即可将“a”对角线移动到0(或任意位置)


但最终,对角线和其他行列式只是基于坐标的函数。算出那些方程式,你的工作就完成了。

行和列都很简单。它们只是x或y坐标

游戏正在检测对角线

如果你仔细想一想,这并不难

考虑:

a
ba
cba
dcba
edcba
通过一点研究,你可以看到细胞和对角线之间的关系

但是桌子的另一半呢

考虑这一点:

a
ba
cba
dcba
-----
edcba
fedcb
gfedc
hgfed
ihgfe
-----
 ihgf
  ihg
   ih
    i
这些线是表格的边界,但您可以看到对角线仅从表格的“外部”投影。因此,一旦你能解决基本问题(桌上的问题),可以说“把你的桌子弄大”。例如,要找出右上角“a”的对角线,您很可能最终得到的“对角线数”是,哦,-4或-5(类似的东西)。只需将其向后移动(即添加4或5)与其余部分一起,即可将“a”对角线移动到0(或任意位置)


但最终,对角线和其他行列式只是基于坐标的函数。算出这些方程,你的工作就完成了。

对此的一般回答是,这就像一个CAT扫描,有一篇非常好的介绍性文章 这给出了如何真正完成的一个简单概述()


另一方面,我发现很难相信编程竞赛期望您这样做,因此我怀疑对于简单的情况,可以将其视为约束满足问题,因此您可以尝试搜索可能解决方案的空间,并在解决方案与约束不匹配的地方停止搜索。根据您的搜索结构和检查约束的效率,这对于小问题来说可能足够有效。

一般的答案是,这就像一个CAT扫描,有一篇非常好的介绍性文章 这给出了如何真正完成的一个简单概述()


另一方面,我发现很难相信编程竞赛期望您这样做,因此我怀疑对于简单的情况,可以将其视为约束满足问题,因此您可以尝试搜索可能解决方案的空间,并在解决方案与约束不匹配的地方停止搜索。根据搜索的结构和检查约束的效率,对于小问题来说,这可能足够有效。

我太喜欢逻辑练习了,所以我花了一段时间用javascript编写了一个解决方案。首先,代码创建一个表以显示结果并用作数据结构,然后有四个函数用于检查水平线、垂直线和两条对角线。这四个函数中的每一个都有相同的形式:在每一行上,查找未设置值的自由单元格的数量,以及包含主体的完整单元格的数量。然后,如果有足够的自由细胞容纳身体的剩余细胞,则填充这些细胞。最后,如果没有包含主体的剩余单元格,请将剩余的自由单元格标记为空

之后,剩下的就是冲洗并重复。每次运行四个函数中的一个时,都会有更多的单元格标记为“已满”或“空”,从而使下一个函数能够在有更多约束的情况下执行相同的操作。所有四个函数的三个过程解决了示例问题,尽管更大、更复杂的形状肯定需要更多,如果它们可以解决的话。我很容易想象这种方法无法解决的形状

function create(rows, cols) {
  var table = document.createElement('table');
  for (var i = 0; i < rows; i++) {
    var row = table.insertRow(-1);
    for (var k = 0; k < cols; k++) {
      var cell = row.insertCell(-1);
      cell.value = null;
      cell.innerHTML = '&nbsp;';
      cell.style.width = '15px';
      cell.style.backgroundColor = '#cccccc';
    }
  }
  table.maxrow = rows - 1;
  table.maxcol = cols - 1;
  document.body.appendChild(table);
  return table;
}
function checkRows(table, rows) {
  for (var i = 0; i < rows.length; i++) {
    var free = 0;
    var full = 0;
    for (var k = 0; k <= table.maxcol; k++) {
      if (table.rows[i].cells[k].value == null) {
        free++;
      } else if (table.rows[i].cells[k].value == 1) {
        full++;
      }
    }
    if (free == 0) {
      continue;
    } else if (rows[i] - full == free) {
      for (var k = 0; k <= table.maxcol; k++) {
        if (table.rows[i].cells[k].value == null) {
          table.rows[i].cells[k].style.backgroundColor = '#ffcccc';
          table.rows[i].cells[k].value = 1;
        }
      }
    } else if (rows[i] - full == 0) {
      for (var k = 0; k <= table.maxcol; k++) {
        if (table.rows[i].cells[k].value == null) {
          table.rows[i].cells[k].style.backgroundColor = '#ccffcc';
          table.rows[i].cells[k].value = 0;
        }
      }
    }
  }
}
function checkCols(table, cols) {
  for (var i = 0; i < cols.length; i++) {
    var free = 0;
    var full = 0;
    for (var k = 0; k <= table.maxrow; k++) {
      if (table.rows[k].cells[i].value == null) {
        free++;
      } else if (table.rows[k].cells[i].value == 1) {
        full++;
      }
    }
    if (free == 0) {
      continue;
    } else if (cols[i] - full == free) {
      for (var k = 0; k <= table.maxrow; k++) {
        if (table.rows[k].cells[i].value == null) {
          table.rows[k].cells[i].style.backgroundColor = '#ffcccc';
          table.rows[k].cells[i].value = 1;
        }
      }
    } else if (cols[i] - full == 0) {
      for (var k = 0; k <= table.maxrow; k++) {
        if (table.rows[k].cells[i].value == null) {
          table.rows[k].cells[i].style.backgroundColor = '#ccffcc';
          table.rows[k].cells[i].value = 0;
        }
      }
    }
  }
}
function checkDiagonals1(table, diagonals) {
  for (var i = 0; i < diagonals.length; i++) {
    var row = i;
    var col = 0;
    if (i > table.maxrow) {
      row = table.maxrow;
      col = i - row;
    }
    var free = 0;
    var full = 0;
    for (var k = 0; k <= row && col + k <= table.maxcol; k++) {
      if (table.rows[row - k].cells[col + k].value == null) {
        free++;
      } else if (table.rows[row - k].cells[col + k].value == 1) {
        full++;
      }
    }
    if (free == 0) {
      continue;
    } else if (diagonals[i] - full == free) {
      for (var k = 0; k <= row && col + k <= table.maxcol; k++) {
        if (table.rows[row - k].cells[col + k].value == null) {
          table.rows[row - k].cells[col + k].style.backgroundColor = '#ffcccc';
          table.rows[row - k].cells[col + k].value = 1;
        }
      }
    } else if (diagonals[i] - full == 0) {
      for (var k = 0; k <= row && col + k <= table.maxcol; k++) {
        if (table.rows[row - k].cells[col + k].value == null) {
          table.rows[row - k].cells[col + k].style.backgroundColor = '#ccffcc';
          table.rows[row - k].cells[col + k].value = 0;
        }
      }
    }
  }
}
function checkDiagonals2(table, diagonals) {
  for (var i = 0; i < diagonals.length; i++) {
    var row = table.maxrow;
    var col = i;
    if (i > table.maxcol) {
      row = table.maxrow - i + table.maxcol;
      col = table.maxcol;
    }
    var free = 0;
    var full = 0;
    for (var k = 0; k <= row && k <= col; k++) {
      if (table.rows[row - k].cells[col - k].value == null) {
        free++;
      } else if (table.rows[row - k].cells[col - k].value == 1) {
        full++;
      }
    }
    if (free == 0) {
      continue;
    } else if (diagonals[i] - full == free) {
      for (var k = 0; k <= row && k <= col; k++) {
        if (table.rows[row - k].cells[col - k].value == null) {
          table.rows[row - k].cells[col - k].style.backgroundColor = '#ffcccc';
          table.rows[row - k].cells[col - k].value = 1;
        }
      }
    } else if (diagonals[i] - full == 0) {
      for (var k = 0; k <= row && k <= col; k++) {
        if (table.rows[row - k].cells[col - k].value == null) {
          table.rows[row - k].cells[col - k].style.backgroundColor = '#ccffcc';
          table.rows[row - k].cells[col - k].value = 0;
        }
      }
    }
  }
}

var rows = new Array(10, 10, 6, 4, 6, 8, 13, 15, 11, 6);
var cols = new Array(2, 4, 5, 5, 7, 6, 7, 10, 10, 10, 7, 3, 3, 5, 5);
var diagonals1 = new Array(0, 1, 2, 2, 2, 2, 4, 5, 5, 6, 7, 6, 5, 6, 6, 5, 5, 6, 6, 3, 2, 2, 1, 0);
var diagonals2 = new Array(0, 0, 1, 3, 4, 4, 4, 4, 3, 4, 5, 7, 8, 8, 9, 9, 6, 4, 4, 2, 0, 0, 0, 0);
var table = create(rows.length, cols.length);

checkRows(table, rows);
checkCols(table, cols);
checkDiagonals1(table, diagonals1);
checkDiagonals2(table, diagonals2);
函数创建(行、列){
var table=document.createElement('table');
对于(变量i=0;i对于(var k=0;k我太喜欢逻辑练习了,所以我花了一段时间制定了一个解决方案