行列[n,n]が与えられた場合、[0,0]から[n,n]に非再帰的に到達できる方法の数を調べたいと思います。
私のアプローチは
- これまでに移動した行、列、パスを格納するスタクト ノードを作成する
- ノードをキューに追加する
- 空でなくなるまでキューを繰り返します。行をインクリメントし、列をインクリメントします。キューに追加する
- 行=n、列=nの場合はパスを出力します
質問
- 行、列、パスを保存する別の方法はありますか
- n が非常に大きい場合、キューにノードを格納することが問題になる可能性があります。どうすればこれを回避できますか?
私は再帰的な解決策を探していません。多くのインタビュー フォーラムでこのような質問を目にするので、これが正しいアプローチかどうかを知りたいと思います。
以下はノードの構造と機能です
struct Node
{
public int row;
public int col;
public string path;
public Node(int r, int c, string p)
{
this.row = r;
this.col = c;
this.path = p;
}
}
public static void NextMoveNonRecursive(int max)
{
int rowPos;
int colPos;
string prevPath = "";
Node next;
while (qu.Count > 0)
{
Node current = qu.Dequeue();
rowPos = current.row;
colPos = current.col;
prevPath = current.path;
if (rowPos + 1 == max && colPos + 1 == max)
{
Console.WriteLine("Path = ..." + prevPath);
TotalPathCounter++;
}
if (rowPos + 1 < max)
{
if (prevPath == "")
prevPath = current.path;
prevPath = prevPath + ">" + (rowPos + 1) + "" + (colPos);
next = new Node(rowPos + 1, colPos, prevPath);
qu.Enqueue(next);
prevPath = "";
}
if (colPos + 1 < max)
{
if (prevPath == "")
prevPath = current.path;
prevPath = prevPath + ">" + (rowPos) + "" + (colPos+1);
next = new Node(rowPos, colPos+1, prevPath);
qu.Enqueue(next);
prevPath = "";
}
}
}