C++简单但无法解决?我想不是
C++ Simple but unsolvable? I think not
设T(x,y)为x×y网格上的巡视次数,使得:
- 游览从左上角的广场开始
- 巡回赛包括向上、向下、向左或向右的动作正方形
- 参观团每一个广场只参观一次
- 游览在左下角的广场结束
例如,很容易看出,T(2,2)=1,T(3,3)=2,T(4,3)=0,T(3,4)=4。编写一个程序来计算T(10,4)。
我已经做了好几个小时了。。。我需要一个程序,将网格的维度作为输入,并返回可能的旅行次数?
我已经做了好几个小时了。。。我需要一个程序,将网格的维度作为输入,并返回可能的旅行次数?
我写这个代码是为了解决这个问题。。。我似乎不知道如何检查各个方向。
#include <iostream>
int grid[3][3];
int c = 0;
int main(){
solve (0, 0, 9);
}
int solve (int posx, int posy, steps_left){
if (grid[posx][posy] = 1){
return 0;
}
if (steps_left = 1 && posx = 0 && posy = 2){
c = c+1;
return 0;
}
grid[posx][posy] = 1;
// for all possible directions
{
solve (posx_next, posy_next, steps_left-1)
}
grid[posx][posy] = 0;
}
算法由@KarolyHorvath您需要一些数据结构来表示网格上单元格的状态(已访问/未访问)。
您的算法:
step(posx, posy, steps_left)
if it is not a valid position, or already visited
return
if it's the last step and you are at the target cell
you've found a solution, increment counter
return
mark cell as visited
for each possible direction:
step(posx_next, posy_next, steps_left-1)
mark cell as not visited
和一起跑步步长(0,0,sizex*sizey)
这并不困难,因为您已经获得了算法。为了解决这个问题,您可能需要某种动态数据结构(除非你只对T(10,4)的精确情况感兴趣)。对于其余部分,左边是x索引上的-1,右边是+1,下面是y维度,向上+1。添加边界检查和验证没有被访问,工作就完成了。
但我想知道这样一个显而易见的算法需要多少时间。有每个小区的四路决策;对于T(10,4)的40个细胞,这是4^40的决定。这是不可行的。比如消除已经访问的小区和边界检查消除了许多分支,但是。。。比赛的目标可能是让你找到更好的算法。
您真的应该选择一个调试器,看看在一个小板(2x2,3x3)上发生了什么。
一个明显的问题是=
是赋值,而不是比较。与==
进行比较。
还有更多的问题。找到他们。
相关文章:
- 对于 ~95% 写入/5% 读取线程安全的无序列图,有没有一个简单的解决方案?
- 试图解决这个简单的C++程序,但我被困在某个地方
- 固定长度的最常见子字符串 - 需要简单的解决方案
- 简单的智能感知解决方案
- QT创建者:简单程序未解决的外部符号和外部符号错误
- C 未解决的外部词,具有简单的类定义
- 简单程序没有输出和崩溃.我的解决方案有什么问题
- C++非常简单的未解决外部
- 非常简单的 x64 组装/C++应用程序中未解决的外部错误
- 在DLL中使用的最简单的C++PUSH通知/POST解决方案
- 简单解决方案的输出不正确
- 简单的尝试 c++ 的捕获循环解决方案
- 一个好的,简单的,便携式的解决方案,用于等待输入C++
- 在简单的哈希表中解决内存泄漏和语法问题
- 遍历数组的简单任务.以下哪种解决方案最有效
- C++简单但无法解决?我想不是
- 什么库可以解析和解决C++中的简单数学表达式
- 比迭代所有组合更简单的解决方案
- 无法链接简单的DLL解决方案
- 在一个文件夹(及其子文件夹)的所有文件上循环:最简单的解决方案