2013-04-25 38 views
6

Tôi có vấn đề này mà tôi cần phải giải quyết theo cách hiệu quả nhất. Tôi có một mảng 2d có chứa các thông tin sau: Mọi thứ là 1 là "bức tường" có nghĩa là bạn không thể đi qua nó. 2 là lối vào nơi bạn "nhập" mảng hoặc bản đồ nếu bạn muốn. 3 là những thứ chúng ta cần tìm. Dưới đây là một ví dụ về một bản đồ:Tìm "số" có sẵn trong mảng 2d

1111111 
1 3131 
2 11111 
1 31 
1111111 

Đây có thể là một ví dụ về một mảng mà tôi cần phải xem xét trong Như bạn có thể thấy có một 3 đó là "không thể kết nối, vì nó được bao quanh bởi một bức tường". .... 1" Điều đó có nghĩa rằng có hai số có sẵn trong mảng này

tiên chúng ta cần phải tìm lối vào Từ lối vào có thể được bất cứ nơi nào tôi cần phải tìm kiếm toàn bộ mảng tôi đã làm như sau:

int treasureAmount = 0; 
    Point entrance = new Point(0,0); 
    for (int i = 0; i < N; i++) { 
     for (int j = 0; j < N; i++){ 
      if(map[i][j] == 2){ 
       entrance.x =i; 
       entrance.y =j; 
      } 

     } 

Điều này cần thời gian O (n^2) và tôi không thực sự thấy một cách khác để thực hiện việc này, vì lối vào có thể ở bất cứ đâu. Tuy nhiên tôi không thực sự chắc chắn làm thế nào để tìm thấy những con số có sẵn effectivly và nhanh chóng. Tôi đã nghĩ đến khi tìm kiếm mảng cho lối vào, tôi sẽ tìm thấy tất cả số 3 trong mảng mặc dù một số có thể không truy cập được, và sau đó tôi không thực sự chắc chắn cách tìm kiếm có thể truy cập được.

+0

O (n^2) (hoặc O (mn)) là cách tốt nhất bạn có thể làm ở đây. Vấn đề là liệu bạn có thể làm điều đó trong hoạt động ít hơn hay không ... – nhahtdh

+1

_ "Đầu tiên chúng ta cần tìm lối vào ... lối vào có thể ở bất cứ nơi nào" _ là lối vào theo nghĩa đen ở bất cứ đâu, hoặc bị giới hạn ở "chu vi "của mảng - như trong ví dụ bạn cung cấp? – stormCloud

+0

Lối vào có thể ở bất kỳ đâu trong mảng. Nó có thể là ở giữa hoặc trên "cạnh" –

Trả lời

2

Bạn không thể làm tốt hơn O (n^2). Nó sẽ mất nhiều thời gian chỉ để đọc mảng. Nhưng sau đó bạn có thể thực hiện tìm kiếm độ sâu đầu tiên để tìm 3 có thể truy cập trong mảng. Đây là mã giả.

main() 
{ 
    read array and mark the entrance as ent.x and ent.y and also an array threex[] and threey[] that stores all the exit position. 
    boolean visited[][]; //stores whether array[i][j] is reachable or not. 
    dfs(ent.x,ent.y); 
    for each element in three arrays 
    { 
     if(visited[threex[i]][threey[i]]) print ("Reachable"); 
     else print("not reachable", threex[i], threey[i]); 
    } 
} 
int dx[]={1,0,-1,0},dy[]={0,1,0,-1}; // dx[i], dy[i] tells whether to move in E,N,W,S respectively. 
dfs(int x,int y) 
{ 
    visited[x][y]=true; 
    for(i=0;i<4;i++)//move in all directions 
    { 
     int newx=x+dx[i],newy=y+dy[i]; 
     //check if this is within the array boundary 
     if(newx>=0&&newx<N && newy>=0&&newy<N) 
     if(!visited[newx][newy] && array[newx][newy]!=1) // check if the node is unvisited and that it is pemissible 
      dfs(newx,newy); 
    } 
} 

Vì mỗi phần tử mảng được lấy không quá một lần trong hàm dfs độ phức tạp của mã là O (n^2).

+0

Nó gần như hoạt động^^ Tôi cảm ơn bạn rất nhiều. Trong thực hiện của tôi đôi khi nó không thành công tại hiển thị một con đường mà không có. Nó chỉ xảy ra dọc theo cạnh. Trong ví dụ của tôi tôi đăng, một trong những "1" dọc theo cạnh sẽ được hiển thị như là một nơi có thể di chuyển, mặc dù nó không phải là lối vào –

+0

Tôi đã nhận nó để làm việc ... i accedently chuyển một điểm mà gây ra lối vào được nhân đôi –

+0

Bạn sẽ phân tích thời gian chạy này như thế nào? Tôi đoán rằng trường hợp xấu nhất nó phải đi qua từng vị trí duy nhất trong mảng, khiến nó trở thành trường hợp xấu nhất 2 lần? –

0

Khi tạo mảng, bạn có thể giữ danh sách tọa độ có giá trị là 2. Bạn có thể duyệt danh sách đó trong O (n).

+0

Tôi cần phải tìm một cách hiệu quả để có được số 3.Tôi cần phải giả định rằng tôi được đưa ra mảng hoàn chỉnh, và sau đó tôi cần phải tìm kiếm nó bằng cách nào đó. Tôi chắc chắn 100% rằng tôi chỉ có thể tìm thấy lối vào 2 với một đôi cho vòng lặp, mà sẽ mất O (n^2) thời gian. Có lẽ người ta có thể sử dụng tìm kiếm đầu tiên rộng rãi bằng cách nào đó tìm thấy các con số có sẵn? –

+0

Bạn sẽ cần sử dụng một số thuật toán lấp đầy lũ lụt, nhưng thay vì tìm kiếm giá trị 2 trong O (n^2), bạn có thể bắt đầu tìm kiếm ngay từ các tọa độ có giá trị 2. –

0

Vì cả mục nhập và mục tiêu đều có thể ở bất kỳ đâu trong mảng mà bạn không có nhiều lựa chọn, nhưng để tìm kiếm mọi thứ. Vì vậy, tìm kiếm lối vào của bạn là hiệu quả như nó có thể được, và liên quan đến các mục tiêu tôi khuyên bạn nên maze flood fill algorithm.

Tuy nhiên, phiên bản được liên kết của thuật toán ưu tiên một hướng (giống như đang đổ đầy nước, nó tràn "xuống"). Để hiệu quả nhất có thể, bạn nên làm cho nó mở rộng theo mọi hướng (như bạn đang đổ đầy khí đốt), ví dụ:

  2 
     1 212 
0 101 21012 
     1 212 
      2 

Các con số đại diện cho các lần lặp mở rộng. Việc mở rộng được thực hiện theo bốn hướng: trái, phải, lên và xuống. Khi bạn đạt được mục tiêu, bạn có thể tìm thấy tuyến đường ngắn nhất đơn giản bằng cách quay lại hàng xóm lân cận có chỉ số lặp lại ít hơn một, cho đến khi bạn quay trở lại chỉ số lặp 0 - lối vào.

Các vấn đề liên quan