程序大致结构如下,
namespace AkariPuzzle
{
class Program
{
static void Main(string[] args)
{
//puzzle是自定义的一个AkariPuzzle类,包含一个List
//nodes相当于一个固定的List,对问题无影响
BackTrack(puzzle,nodes,0);
}
//回溯法填灯,从 深度0开始
static bool BackTrack(AkariPuzzle puzzle, List<PuzzlePoint> nodes, int deep)
{
//一条路径找完之后
if (deep == nodes.Count)
{
Solutions.Add(puzzle);
return true;
}
bool correct = true;
int i = nodes[deep].x;
int j = nodes[deep].y;
//找到空余的位置
List<PuzzlePoint> plist = RoomPutBulbs(puzzle, i, j);
List<string> comb = C(plist,puzzle.Array[i][j]);
//选择一种组合进行分支
foreach (var c in comb)
{
//分支
correct = Branch(puzzle, plist, c, nodes, deep) || correct;
//递归回来时发现,puzzle并不是递归之前的现场的值,而是被改变的值
}
return correct;
}
//分支
static bool Branch(AkariPuzzle puzzle, List<PuzzlePoint> plist, string c, List<PuzzlePoint> nodes, int deep)
{
bool correct = true;
//修改puzzle中List的某些值
puzzle.change();
//继续寻找下一个点
correct = BackTrack(puzzle, nodes,++deep);
return correct;
}
}
}
问题是这样,假设在BackTrack函数中第一次调用Branch前,puzzle.list里的值为1,在branch函数中修改puzzle.list为0,此时假设递归终止,返回递归点时,puzzle.list应当为1才对,但是调试的时候发现值不为1。不清楚问题出在哪里,求指点