2016-03-31 11 views
-2

Temelde sıfır NxM bir harita verilen bir program yapmaya çalışıyorum ve olanlar iç değil, kıyı uzunluğu belirleyecek olan göl kıyısı. Bu girişin üzerinde çalıştırdığınızdaKattis görev "Sahil" çözmek için çalışıyor - neden biraz kapalı olduğumu anlayamıyorum

#include <iostream> 
#include <vector> 

using namespace std; 

class Coast { 
    int n, m; 
    vector<vector<int>> vmap; 
    bool isLake = true; 

    // Starts recursive methods 
    void lakeCheckMain(int y, int x){ 
     vmap[y][x] = 10; 
     if(vmap[y-1][x] == 0){ 
     lakeCheck(y-1, x); 
     } 
     if(vmap[y+1][x] == 0){ 
     lakeCheck(y+1, x); 
     } 
     if(vmap[y][x-1] == 0){ 
     lakeCheck(y, x-1); 
     } 
     if(vmap[y][x+1] == 0){ 
     lakeCheck(y, x+1); 
     } 

     if(isLake){ 
     lakeColor(y, x); 
     } 
     else{ 
     lakeDeColor(y, x); 
     } 
    } 

    // Assign value 4 to all connected water 
    void lakeColor(int y, int x){ 
     vmap[y][x] = 4; 
     if(vmap[y-1][x] == 0 || vmap[y-1][x] == 10){ 
     lakeColor(y-1, x); 
     } 
     if(vmap[y+1][x] == 0 || vmap[y+1][x] == 10){ 
     lakeColor(y+1, x); 
     } 
     if(vmap[y][x-1] == 0 || vmap[y][x-1] == 10){ 
     lakeColor(y, x-1); 
     } 
     if(vmap[y][x+1] == 0 || vmap[y][x+1] == 10){ 
     lakeColor(y, x+1); 
     } 
    } 

    // Assigns 0 to all checked water fields 
    void lakeDeColor(int y, int x){ 
     //cout << "lets decolor" << endl; 
     vmap[y][x] = 0; 
     if(vmap[y-1][x] == 10){ 
     lakeDeColor(y-1, x); 
     } 
     if(vmap[y+1][x] == 10){ 
     lakeDeColor(y+1, x); 
     } 
     if(vmap[y][x-1] == 10){ 
     lakeDeColor(y, x-1); 
     } 
     if(vmap[y][x+1] == 10){ 
     lakeDeColor(y, x+1); 
     } 
    } 

    // Checks neightboring fields for what and stops if edge is reached 
    void lakeCheck(int y, int x){ 
     if((y < 1) || (x < 1) || (x > m) || (y > n) || !isLake){ 
     isLake = false; 
     } 
     else{ 
     //cout << y << x << " checking around me" << endl; 
     if(vmap[y-1][x] == 0){ 
      vmap[y][x] = 10; 
      lakeCheck(y-1, x); 
     } 
     if(vmap[y+1][x] == 0){ 
      vmap[y][x] = 10; 
      lakeCheck(y+1, x); 
     } 
     if(vmap[y][x-1] == 0){ 
      vmap[y][x] = 10; 
      lakeCheck(y, x-1); 
     } 
     if(vmap[y][x+1] == 0){ 
      vmap[y][x] = 10; 
      lakeCheck(y, x+1); 
     } 
     } 
    } 


    public: 
    int checker(){ 
     double result; 
     cin >> n >> m; 

     //Map init 
     vmap.resize(n+2); 
     for(int i = 0 ; i < n+2 ; ++i){ 
      vmap[i].resize(m+2); 
     } 

     // -1, m to 0 
     // n, -1 to 0 
     for (size_t i = 0; i <= m; i++) { 
      vmap[0][i] = 0; 
      vmap[n+1][i] = 0; 
     } 
     for (size_t i = 0; i <= n; i++) { 
      vmap[i][0] = 0; 
      vmap[i][m+1] = 0; 
     } 

     for (size_t i = 0; i < n; i++) { 
     string tempStrng; 
     cin >> tempStrng; 
     for (size_t j = 0; j < m; j++) { 
      int binVal = tempStrng.at(j) - 48; 
      vmap[i+1][j+1] = binVal; 
     } 
     } 

     // Sets all land fields to 4 as well as setting all inland lakes to the value 4 
     for (size_t i = 1; i <= n; i++) { 
     for (size_t q = 1; q <= m; q++) { 
      if(vmap[i][q] == 1){ 
       vmap[i][q] = 4; 
      } 
      else if(vmap[i][q] == 0){ 
       isLake = true; 
       //cout << i << ", " << q << " checking water" << endl; 
       lakeCheckMain(i, q); 
      } 
     } 
     } 

     /*string resultStr; 
     for (size_t i = 1; i < n+1; i++) { 
     for (size_t q = 1; q < m+1; q++) { 
      resultStr += to_string(vmap[i][q]); 
     } 
     resultStr += "\n"; 
     } 
     cout << resultStr << endl;*/ 

     //Dynamically goes through the map from top left and looks left and above for other land 
     //Skips water 
     for (size_t i = 1; i <= n; i++) { 
     for (size_t q = 1; q <= m; q++) { 
      if(vmap[i][q] == 0){ 
       continue; 
      } 
      if(vmap[i-1][q] != 0){ 
       vmap[i][q] -= 1; 
       vmap[i-1][q] -= 1; 
      } 
      if(vmap[i][q-1] != 0){ 
       vmap[i][q] -= 1; 
       vmap[i][q-1] -= 1; 
      } 
     } 
     } 

     for (size_t i = 0; i <= n; i++) { 
     for (size_t q = 0; q <= m; q++) { 
      result += vmap[i][q]; 
     } 
     } 

     cout << result << endl; 
    } 
}; 



int main(){ 
    Coast c; 
    c.checker(); 
} 

: Burada

kodum var farkındayım

101011100110010000010110010001 
111111001011111110101110100001 
111111110011100110111011010000 
010100110111000110101110001100 
001010100110111101011000000011 
010100011100000000000100011100 
000001111010010110111001010110 
110111001111100001100000001010 
110101111110001110101101111101 
110011000101101001010111000111 
110001111011000010010111110001 
000111100100011000101111101111 
000000001100000000000001101101 
101001001011001010010010101111 
011101101010010010101111101101 
101010100111111101110000010111 
110100011100100110011010001100 
100110010100000000111001111100 
000011010110101000100001110101 
011010101011010110110110101011 

ben 302 alıyorum ama 308. gireceğim bu sorun ile BFS tarafından doğrusal olarak, ama başladığımda görmedim. Şimdi sadece kodumun çalışmasını istiyorum. Birisi benim çıldırmadan önce kodumdaki hatayı fark edebilir. Sadece benim kod (Java) ve o verir sonuçla bana verdi Bu örnek çalıştırmak

Ayrıca 302.

olduğunu

cevabımı güncelleştiriyorum

+1

İşte bir ipucu. BFS/DFS'nin nasıl yazılacağını bilmek iyidir. Dikdörtgene ek bir yapay su çerçeve ekleyin. Su hücreleri tarafından BFS/DFS'yi (0,0) 'dan çalıştırın. Mevcut su hücresine komşu bir kara hücresini her defasında sayacı arttırır. Gölleri düşünmeye gerek yok. –

+0

Sorunuzun gövdesine * kodu eklemediyseniz, sorunuzu sorgusuzdur *. Site dışı bağlantılar kötü gitme eğilimi gösterdiklerinden dolayı çatılır. –

cevap

0

.. benim kod kattis sahil testini yaziyi kopyalayip yapistiran .

Niçin sonuç 308 olmalı? Bunu elden geçirdin mi?

İlgili konular