2D গ্রিড বন্যা পূরণ করুন


9

চ্যালেঞ্জের বিবরণ

আসুন কল দুই dimentional, আয়তাকার অ্যারে (তার যে subarray অর্থ একই দৈর্ঘ্য), একটি গ্রিড । গ্রিডের প্রতিটি ইউনিট হয় ফাঁকা জায়গা বা সীমানা । অক্ষরের একটি গ্রিডে, খালি স্থানটি একক সাদা স্থানের দ্বারা প্রতিনিধিত্ব করা হয়; অন্য কোনও চরিত্রকে সীমানা হিসাবে বিবেচনা করা হয়। নমুনা গ্রিড ( +'s, |' s এবং -'পাঠযোগ্যতার জন্য যুক্ত হয়েছে - তারা গ্রিডের অংশ নয় ):

+----+
|    |
|    |
|    |
|    |
|    |
+----+  an empty 4x5 grid

+------+
|      |
|  #   |
|  #   |
+------+  a 6x3 grid with 2 borders

+----------+
|          |
|          |
|  #####   |
|  #   #   |
| ##   # <------ enclosed area
| #    #   |
| ######   |
|          |
+----------+  a 10x8 grid with an enclosed area

একটি 2 ডি গ্রিড এবং একজোড়া স্থানাঙ্ক দেওয়া, স্থানাঙ্কগুলির দ্বারা উপস্থাপিত বিন্দুর চারপাশে বদ্ধ অঞ্চলটি পূরণ করুন।

নমুনা ইনপুট / আউটপুট

1)

0 0
+----------+      +----------+
|          |      |XXXXXXXXXX|
|          |  ->  |XXXXXXXXXX|
|          |      |XXXXXXXXXX|
+----------+      +----------+

2)

6 5
+-----------------+      +-----------------+
|                 |      |                 |
|                 |      |                 |
|    ########     |      |    ########     |
|    #       #    |      |    #XXXXXXX#    |
|    #    ####    |      |    #XXXX####    |
|    #    #       |      |    #XXXX#       |
|    #    #       |  ->  |    #XXXX#       |
|    #    #       |      |    #XXXX#       |
|     ####        |      |     ####        |
|                 |      |                 |
|                 |      |                 |
+-----------------+      +-----------------+

3)

4 6
+-----------------+      +-----------------+
|                 |      |XXXXXXXXXXXXXXXXX|
|    ####         |      |XXXX####XXXXXXXXX|
|   #    #        |  ->  |XXX#    #XXXXXXXX|
|    ####         |      |XXXX####XXXXXXXXX|
|                 |      |XXXXXXXXXXXXXXXXX|
+-----------------+      +-----------------+

4)

4 5
+-----------------+      +-----------------+      +-----------------+ 
|                 |      |                 |      |                 |
|                 |      |                 |      |                 |
|    ####         |      |    ####         |      |     XXXX        |
|    ####         |  ->  |    ####         |  or  |     XXXX        |
|    ####         |      |    ####         |      |     XXXX        |
|                 |      |                 |      |                 |
+-----------------+      +-----------------+      +-----------------+

5)

2 6
+----------------+      +----------------+
|                |      |XXXXXXXXXXXXXXXX|
|                |      |XXXXXXXXXXXXXXXX|
|                |      |XXXXXXXXXXXXXXXX|
|                |  ->  |XXXXXXXXXXXXXXXX|
|                |      |XXXXXXXXXXXXXXXX|
|BBBBBBBBBBBBBBBB|      |BBBBBBBBBBBBBBBB|
|                |      |                |
|                |      |                |
+----------------+      +----------------+

মন্তব্য

  • একটি খালি গ্রিড বদ্ধ হিসাবে বিবেচিত হয়, অর্থাৎ সীমানাগুলিও স্পষ্টভাবে গ্রিডের প্রান্ত বরাবর অবস্থিত (উদাহরণ 1. এবং 5 দেখুন),

  • একটি বদ্ধ অঞ্চলের এক কোণে এল-আকৃতির হওয়া দরকার না। নিম্নলিখিত দুটি ক্ষেত্র সমান:

####         ##
#  #        #  #
#  #   ==   #  #
#  #        #  #
####         ##
  • যদি স্থানাঙ্কগুলির অধীনে কোনও ইউনিট সীমান্ত হিসাবে দেখা দেয় তবে আপনি গ্রিডটি অপরিবর্তিত রাখতে পারেন (উদাহরণস্বরূপ ৪)) বা এটিকে খালি স্থান হিসাবে বিবেচনা করতে পারেন,

  • আপনি ফিলার / খালি জায়গার জন্য যে কোনও অক্ষর চয়ন করতে পারেন যতক্ষণ আপনি এই তথ্য জমা দেওয়ার ক্ষেত্রে অন্তর্ভুক্ত করেন,

  • যদি charআপনার উদ্দেশ্যগুলির জন্য স্যুট ব্যতীত অন্য কোনও ধরণের ব্যবহার করা হয় তবে আপনি ints( 0খালি জায়গার 1জন্য, সীমান্তের জন্য) বা booleans( trueএবং falseযথাক্রমে) বা অন্য কোনও ধরণের ব্যবহার করতে পারেন - কেবল আপনার জমা দেওয়ার মধ্যে এই তথ্যটি অন্তর্ভুক্ত করার বিষয়ে নিশ্চিত হন,

  • উপরোক্ত উদাহরণগুলিতে ব্যবহৃত স্থানাঙ্কগুলি হ'ল 0-সূচকযুক্ত (row, column)স্থানাঙ্ক, কারণ এটি দ্বি-মাত্রিক অ্যারের পক্ষে আরও সুবিধাজনক। আপনি যদি (column, row)(কার্টেসিয়ান) সিস্টেম এবং / অথবা অ-0-সূচিযুক্ত স্থানাঙ্ক ব্যবহার করতে চান তবে এটি আপনার জমা দেওয়ার ক্ষেত্রে উল্লেখ করুন।

  • আপনি কোথায় শুরু করবেন তা জানেন না, বন্যার ভরাটের বিষয়ে উইকিপিডিয়া নিবন্ধটি দেখুন

  • মনে রাখবেন এটি একটি চ্যালেঞ্জ, তাই আপনার কোডটি যতটা সম্ভব সংক্ষিপ্ত করুন!


সম্পর্কিত: 1 , 2 , 3 , 4 , সম্ভবত আরও।
পিটার টেলর

স্থানাঙ্কগুলির অবস্থানে একটি একক বর্ডার ইউনিটের সাথে একটি পরীক্ষার কেস রাখার উপযুক্ত হতে পারে, এটি দেখানোর জন্য যে দুটি বৈধ আউটপুট রয়েছে: হয় গ্রিডটি সমস্ত পূরণ করা হয় বা গ্রিড অপরিবর্তিত থাকে। (যদি আমি আপনার তৃতীয় নোটটি সঠিকভাবে বুঝতে পারি))
ট্রাইকোপল্যাক্স

প্রাক্তন দেখুন। 4) আপডেট
shooqie

1
আপনি কীভাবে আপনার বিকল্প উদাহরণ পাবেন তা আমি পাই না 4. এটি নির্দিষ্ট ইনপুট বর্গক্ষেত্র ছাড়া অন্য সীমান্ত ঘরগুলি ধ্বংস করছে বলে মনে হচ্ছে।
জোফান

উত্তর:


4

ম্যাটল্যাব, 30 7 বাইট

যেহেতু আমরা স্ট্রিংয়ের পরিবর্তে লজিকাল ইনপুট ব্যবহার করতে পারি, আমরা খালি ফাংশনটি ব্যবহার করতে পারি, এটি যেমন:

@imfill

এটি একটি বেনামে ফাংশন। ব্যবহারের জন্য, আমাদের একটি নাম ধরে নিতে হবে, যেমন f=@imfill। তারপরে আমরা এটির মতো মূল্যায়ন করতে পারি f(input,point)যেখানে inputলজিকাল ম্যাট্রিক্স, যেমন [0,0;0,1], এবং pointএটি 1-ভিত্তিক স্থানাঙ্ক সহ 2 ডি-ভেক্টর, যেমন [1,2]

পুরানো সংস্করণ স্ট্রিংয়ে কাজ করছে:

@(a,p)[imfill(a>32,p)*3+32,'']

এই বেনামে ফাংশন ইনপুট পাশাপাশি স্থানাঙ্কগুলি (1 ভিত্তিক সূচক) সহ একটি ভেক্টর গ্রহণ করে। ফাংশনটি imfillআমাদের যা প্রয়োজন ঠিক তা করে তবে কেবল বাইনারি চিত্রগুলিতে কাজ করে। এজন্য আমরা ইনপুট ম্যাট্রিক্সকে লজিক্যাল অ্যারেতে রূপান্তর করি (যেখানে #সীমানা হয়, এবং (স্পেসগুলি শূন্য হয় ), ফিলিং সম্পাদন করে এবং তারপরে ফিরে রূপান্তরিত হয়। (আবার #ভরাট, স্থান ভরাট নয়)।

ধন্যবাদ - লুইস মেন্ডো - 1 বাইটের জন্য।


স্ট্রিং সংস্করণের জন্য, আপনি ~=32দ্বারা প্রতিস্থাপন করতে পারেন>32
লুইস মেন্ডো

3

সি, 162 বাইট

w,l;char*d;f(z){z<0||z>l||d[z]^32||++d[z]&&f(z+1)+f(z-1)+f(z+w)+f(z-w);}main(c,v)char**v;{l=strlen(d=v[3]),w=strchr(d,10)-d+1,f(atoi(v[2])*w+atoi(v[1]));puts(d);}

আর্গুমেন্ট ( ./floodfill X Y grid) থেকে ইনপুট নেয় । গ্রিডে প্রতিটি লাইনের সমন্বয়ে \nবা তার \r\nমধ্যে অবশ্যই চূড়ান্ত নিউলাইন optionচ্ছিক। শেল থেকে প্রার্থনা করার সহজ উপায়:

./floodfill 1 0 "$(printf "   \n###\n   \n")"
# or
./floodfill 1 0 "$(cat gridfile)"

!ভরাট চরিত্রের জন্য স্ট্যান্ডআউট আউটপুট । যদি শুরুর অবস্থানটি এর সাথে মিলে যায় তবে #কোনও পরিবর্তন হয় না।

ভাঙ্গন:

                                    // GCC is happy enough without any imports
w,l;                                // Globals (line width, total length)
char*d;                             // Global grid pointer
f(z){                               // "Fill" function - z=current cell
    z<0||z>l||                      // Check if out-of-bounds...
    d[z]^32||                       // ...or not empty
        ++d[z]&&                    // Fill cell...
        f(z+1)+f(z-1)+f(z+w)+f(z-w);// ...and continue in "+" pattern
}
main(c,v)char**v;{                  // K&R style function to save 2 bytes
    l=strlen(d=v[3]),               // Store grid & length
    w=strchr(d,10)-d+1,             // Store width of grid (including newlines)
    f(atoi(v[2])*w+atoi(v[1]));     // Parse X & Y arguments and invoke fill

    puts(d);}                       // Print the result

নোট করুন যে এটি ইনপুট আর্গুমেন্ট স্ট্রিংটি পরিবর্তন করার উপর নির্ভর করে, যা নিষিদ্ধ, সুতরাং এটি সমস্ত প্ল্যাটফর্মগুলিতে কাজ করতে পারে না (অন্তর্নিহিত ঘোষণাগুলিও এটি অ-মানক করে তোলে)।


আপনি পরিবর্তন করে 4 বাইট সংরক্ষণ করতে পারবেন int w, l;কেবল থেকে w, l;- জিসিসি অক্ষমতা এটি intটাইপ
Jacajack

@ জ্যাকজ্যাক ভাল পয়েন্ট! ধন্যবাদ
ডেভ

1

সি - 263 247 240 238 বাইট

এটি প্রথম দ্বিতীয় তৃতীয় সংস্করণ, আমি বিশ্বাস করি কোডটিও সঙ্কুচিত হতে পারে।

m[99][99],x,y,a,b,c,n;f(v,w){if(m[v][w]==32){m[v][w]=88;f(v,w+1);f(v+1,w);f(v,w-1);f(v-1,w);}}main(){scanf("%d %d\n",&a,&b);for(;~(c=getchar());m[x++][y]=c,n=x>n?x:n)c==10&&++y&&(x=0);f(b+2,a+1);for(a=-1;++a<y*n+n;)putchar(m[a%n][a/n]);}

এবং পাঠযোগ্য সংস্করণ:

m[99][99], x, y, a, b, c, n;

/*
    a, b - flood fill start coordinates
    v, w - recursive function start coordinates
    x, y - iterators
    c - character read
    m - map
    n - maximum map width found

*/


//Recursive flood function
f( v, w )
{
    if ( m[v][w] == 32 ) //If field is empty (is ' '?)
    {
        m[v][w] = 88; //Put 'X' there
        f(v,w+1);f(v+1,w); //Call itself on neighbour fields
        f(v,w-1);f(v-1,w);
    }
}

main( )
{
    //Read coordinates
    scanf( "%d %d\n", &a, &b );

    //Read map (put character in map, track maximum width)
    for ( ; ~( c = getchar( ) ); m[x++][y] = c, n = x > n ? x : n )
        c == 10 && ++y && ( x = 0 );

    //Flood map
    f( b + 2, a + 1 );

    //Draw
    for ( a = -1; ++a < y * n + n; )
            putchar( m[a % n][a / n] );     

}

সংকলন এবং চালান:
gcc -o flood floodgolf.c && cat 1.txt | ./flood

সম্পদ:

দ্রষ্টব্য: আমি intমান নিয়ে কাজ করছি । প্রতিটি (32) খালি স্থান হিসাবে বিবেচনা করা হয়। অন্য কোনও মান সীমানা হিসাবে বিবেচনা করা হয়। স্থানাঙ্কগুলি ফর্ম্যাটে রয়েছে(row, column)


1
ভুলে যাবেন না যে আপনি এখানে for( scanfএখানে) স্টেটমেন্ট রেখে অর্ধিকলনগুলি সংরক্ষণ করতে পারেন , এবং সস্তা এর প্রথম প্যারামিটারটি সস্তা ইন্ট ডিক্লোরেশন হিসাবে ব্যবহার করা বেশিরভাগ সংকলকগুলিতে কাজ করবে। এছাড়াও আপনি আপনার অ্যারের সমতল করে কিছুটা সাশ্রয় করতে সক্ষম হতে পারেন (অবশ্যই মুদ্রণের লুপটি সাহায্য করবে)
ডেভ

@ ডেভ ঠিক আছে আমি এই কোডটি লেখার পর থেকে আমি কিছুটা শিখেছি। আমি মনে করি 1D অ্যারেতে ডেটা সংরক্ষণ করা আমাকে অনেক কিছু বাঁচাতে সহায়তা করবে, তবে অবশ্যই আমি আপনার ধারণাটি অনুলিপি করতে চাই না। আমি পরে কি করতে পারি তা দেখতে পাবো। ধন্যবাদ!
জ্যাকাজ্যাক

0

পাইথন 2, 158 বাইট

এটি অনলাইনে চেষ্টা করুন । সহজ পুনরাবৃত্তি সমাধান

a,X,Y=input()
M=len(a)
N=len(a[0])
def R(x,y):
 if~0<x<M and~0<y<N and a[x][y]:a[x][y]=0;R(x-1,y);R(x+1,y);R(x,y-1);R(x,y+1)
R(X,Y)
print'\n'.join(map(str,a))

সারি-কলামের ক্রমে 0-অনুসৃত

1 - খালি স্থান, 0 - ভরাট স্থান

1 এবং 0 এর অ্যারে এবং দুটি সংখ্যার অ্যারে হিসাবে ইনপুট নেয়


0

পার্ল 5 , 129 + 1 (-a) = 130 বাইট

sub f{my($r,$c)=@_;$a[$r][$c]eq$"&&($a[$r][$c]=X)&&map{f($r+$_,$c);f($r,$c+$_)}-1,1}@a=map[/./g],<>;f$F[0]+1,$F[1]+1;say@$_ for@a

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

sub f{   # recursive subroutine
  my($r,$c)=@_; # taking row and column as inputs
  $a[$r][$c]eq$"&&  # using Boolean short circuit as an 'if' statement to 
                    # check if the current position in the global array is blank
  ($a[$r][$c]=X)&&  # then setting it to 'X'
  map{f($r+$_,$c);f($r,$c+$_)}-1,1 # and checking the four surrounding spaces
}
# -a command line option implicitly splits the first line into the @F array
@a=map[/./g],<>;    # put the input in a 2-D array
f$F[0]+1,$F[1]+1;   # start the fill at the given position, correcting for
                    # Perl's 0 based arrays
say@$_ for@a        # output the resulting pattern
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.