-2

我有这个函数可以创建一个 BFS 。我有一个功能,这是我的代码,并且:

static void Breadth_first_search(Queue<int> Q, List<int > trace, int[,] grid, int start, int nodes)
        {
            int u;
            List<int> visited = new List<int>(220000);            
            Q.Enqueue(start);            
            trace[start] =  -1;            
            visited[start] = 1;
            do
            {
                u = Q.Peek();
                Q.Dequeue();
                for (int v = 1; v <= nodes; ++v)
                {
                    if ((grid[u, v] == 1) && visited[v] == 0)
                    {
                        Q.Enqueue(v);
                        trace[v] = u;
                        visited[v] = 1;
                    }
                }
            } while (Q.Count != 0);
        }

问题是那行不通。我有这个错误:

指数超出范围。必须是非负数且小于集合的大小。参数名称:索引

在这儿 :

trace[start] =  -1;            
visited[start] = 1;

我在 main 中调用了函数:

static int Main()
        {

            List<int> trace = new List<int>(220);
            Queue<int> Q = new Queue<int>();
            int[,] grid = new int[582,582];                          

            int nodes;
            int vertices;
            Console.Write("Please input the number of Node : \n");

            nodes = Convert.ToInt32(Console.ReadLine());
            vertices = 200;
            Read_input_from_user(grid, vertices);
            int starting_position;
            int finishing_position;
            Console.Write("Please Input the Starting Node : \n");              
            starting_position = Convert.ToInt32(Console.ReadLine());
            Console.Write("Please Input the Finishing Node : \n");
            finishing_position = Convert.ToInt32(Console.ReadLine());
            Breadth_first_search(Q, trace, grid, starting_position, nodes);
            Trace_result(trace, starting_position, finishing_position, nodes);
            Console.ReadLine();
            return 0;
        }
4

1 回答 1

1

当用户输入大于 220 的内容作为起始位置时,此行

trace[start] =  -1;

将抛出异常,因为start确实超出了trace界限。因此,您需要强制用户输入您可以处理的内容。像这样:

Console.Write("Please Input the Starting Node : \n");
starting_position = Convert.ToInt32(Console.ReadLine());
while (starting_position < 0 || starting_position >= trace.Count)
{
    Console.Write("Starting Node is invalid. Should be between 0 and 220. Please enter another one  : \n");
    starting_position = Convert.ToInt32(Console.ReadLine());
}

这只是一个想法,重点是 - 您应该考虑用户输入验证,这样它就不会破坏您的程序。

更新。实际上我没有意识到trace在上面的代码中根本不包含任何条目。这意味着用任何索引调用它都会产生错误——如果列表根本不包含元素,显然不可能调用一个或设置它的值。因此,尽管您应该对用户输入有一个验证机制仍然是正确的,但这里的主要问题是如何处理列表。以下是解决它的方法:

  1. 您可以使用相同的值初始化列表,例如 0:

    List<int> trace = Enumerable.Repeat(0, 220).ToList();
    
  2. 或者您可以使用数组而不是列表:

    int[] trace = new int[220];
    
于 2013-08-12T22:17:13.133 回答