নদীর গভীরতানির্ণয় এলোমেলো পথ


23

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা তিনটি পূর্ণসংখ্যার, একটি প্রস্থ w, একটি উচ্চতা hএবং একটি পদক্ষেপ গণনা করে s। আপনি একটি অ-স্ব ছেদ অঙ্কন করা হবে এলোমেলো হাটা s একটি দীর্ঘ পদক্ষেপ 5*wদ্বারা 5*hপিক্সেল ইমেজ যেখানে প্রতি 5 5 পিক্সেল সেল পারেন খালি (খাঁটি বেইজ রঙ) অথবা এই বারটি সহজ "পাইপ" এর এক:

বর্ধিত পাইপ

উপরের চিত্রটি বিস্তারিত দেখানোর জন্য বাড়ানো হয়েছে। প্রকৃত আকারে পাইপগুলি এখানে রয়েছে:

পাইপ

(ধূসর রেখাগুলি কেবল পাইপের ধরণের পৃথক করার জন্য))

এলোমেলো হাঁটা একটি একক অবিচ্ছিন্ন পাইপ পাথ হবে যা একটি পাইপের শেষ পয়েন্ট (নীচের চারটি পাইপের ধরণের একটি) থেকে শুরু হয়ে অন্য পাইপের শেষ পয়েন্টে শেষ হয়।

গ্রিড wদ্বারা খালি দিয়ে শুরু করুন hএবং এলোমেলোভাবে একটি কক্ষকে প্রারম্ভের পয়েন্ট হিসাবে চয়ন করুন। তারপরে এলোমেলোভাবে শুরু করতে চার দিকের একটি বেছে নিন এবং সংশ্লিষ্ট পাইপ শেষের অবস্থানটি আঁকুন। এই শুরুর ঘরটি আপনার হাঁটার প্রথম ধাপ চিহ্নিত করে এবং প্রতিবার আপনি যখন একটি নতুন ঘর আঁকেন বা বিদ্যমান কোনও ওভাররাইট করে সেটি অন্য পদক্ষেপ হিসাবে গণ্য হয়।

এখন বারবার, এলোমেলোভাবে ডান, বাম বা সোজা যেতে বেছে নিন, যদি সঠিক দিকটি চয়ন করা বৈধ হয় তবে উপযুক্ত পাইপ সেল আঁকুন। সম্পূর্ণ sপদক্ষেপের পথ তৈরি না হওয়া পর্যন্ত কোনও দিক বৈধ না হলে ব্যাকট্র্যাক এবং পুনরায় নির্বাচন করুন । পাথটি একটি পাইপের শেষ পয়েন্টের সাথে শেষ হওয়া উচিত, যা গ্রিডের যে কোনও জায়গায় থাকতে পারে, সেই পথটি যে পথটি নিয়েছিল তার উপর নির্ভর করে।

এটি লক্ষ করা খুব গুরুত্বপূর্ণ যে কেবল দুটি সরল পাইপ কোষ ওভাররাইট করা যেতে পারে এবং কেবল বিপরীত অভিমুখের সোজা পাইপ কোষ দ্বারা, ফলাফলটি একটি ছেদ সেল হয়। অন্যথায়, সমস্ত পাইপ অবশ্যই খালি কোষে রাখতে হবে।

যখন একটি ছেদটি আঁকানো হয়, প্রারম্ভিক ঘরটি সহ আরও যে অংশটির অংশ রয়েছে তা শীর্ষে আঁকতে হবে।

গ্রিডের পর্যায়ক্রমিক সীমানা শর্ত (পিবিসি) রয়েছে কিনা তা আপনার উপর নির্ভর করে, গ্রিডের এক পাশ থেকে বেরিয়ে আসা পাইপটি অন্য দিকে বেরিয়ে আসবে কিনা। পিবিসি ছাড়াই গ্রিডের সীমানা এমন একটি বাধা হিসাবে গণ্য হয়েছে যা আপনি অন্যান্য পাইপের মতো চালাতে পারেন।

বিশেষ ক্ষেত্রে

  • যখন s0 হয় কোনও পাইপ আঁকতে হবে না এবং চিত্র 5*wদ্বারা আউটপুট ফাঁকা হওয়া উচিত 5*h(অর্থাত্ সমস্ত বেইজ)।
  • যখন s1 একক পাইপ স্টাব হয়

    বর্ধিত পাইপ স্টাব(প্রকৃত আকার পাইপ স্টাব:)

    এলোমেলোভাবে নির্বাচিত শুরু কক্ষে আঁকা উচিত at

অন্যান্য বিস্তারিত

  • আপনি ধরে নিতে পারেন যে sএটি সর্বাধিক w*hতাই একটি পথ সর্বদা সম্ভব হবে। (যদিও দীর্ঘতর পথগুলি ছেদগুলির কারণে সম্ভব))
  • wএবং hসর্বদা ইতিবাচক হবে।
  • সমস্ত এলোমেলো পছন্দ অবশ্যই অভিন্ন র্যান্ডম হতে হবে । উদাহরণস্বরূপ, যখন মোড়গুলি সম্ভব হয় তখনও এটি যখন আরও সহজে করা হয় তখন আপনার এড়ানো উচিত নয়। সিউডো-এলোমেলো নম্বর জেনারেটর অনুমোদিত।
  • কালো, নীল এবং বেইজের জায়গায় কোনও তিনটি দৃশ্যত পৃথক রঙ ব্যবহার করা যেতে পারে।
  • আপনার আউটপুট চিত্রগুলি বড় করা যেতে পারে যাতে সেগুলি পিক্সেল 5*w*kদ্বারা সত্যই 5*h*kযেখানে kধনাত্মক পূর্ণসংখ্যার হয়। (আপনার পোস্টের যে কোনও উদাহরণ ব্যাখ্যা করার জন্য আপনার k1 টি হলেও পরামর্শ দেওয়া হচ্ছে))
  • যে কোনও সাধারণ লসলেস ইমেজ ফাইল ফর্ম্যাট ব্যবহার করা যেতে পারে এবং চিত্রটি কোনও ফাইলে সংরক্ষিত হতে পারে, প্রদর্শিত হতে পারে বা স্টাডাউটে কাঁচা বানানো হতে পারে।

বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।

উদাহরণ

(সমস্ত 500% দ্বারা প্রসারিত)

যদি ইনপুট হয় w=2, h=1, s=0তবে আউটপুট সর্বদা থাকবে:

যদি ইনপুট হয় w=2, h=1, s=1তবে আউটপুটটি সমান সুযোগ সহ এই চিত্রগুলির মধ্যে একটি হবে:

যদি ইনপুট হয় w=2, h=1, s=2তবে আউটপুট হবে

বা সম্ভবত

যদি গ্রিডে পিবিসি ধরা হয়।

(দ্রষ্টব্য যে পথটি শুরু করা দ্বিতীয় ধাপটিকে অসম্ভব করে তুলবে))


w=3, h=2, s=6পিবিসি ধরে ধরে এখানে কিছু সম্ভাব্য ফলাফল রয়েছে :


w=3, h=3, s=9পিবিসি ধরে ধরে এখানে একটি সম্ভাব্য আউটপুট দেওয়া হয়েছে :

লক্ষ করুন যে দুটি ধাপ হিসাবে ছেদ করা সংযোগের কারণে পথটির সমস্ত কক্ষকে আবরণ করার প্রয়োজন ছিল না। এছাড়াও, আমরা অনুমান করতে পারি যে কোণার শেষ পয়েন্টটি একটি প্রারম্ভিক সেল ছিল যেহেতু চৌরাস্তা ওভারপাস অবশ্যই পরে আঁকা উচিত। সুতরাং আমরা তৈরি করা এলোমেলো পছন্দগুলির ক্রমটি অনুমান করতে পারি:

start at top left, facing east
go straight
go right
go right
go right
go straight
go left
go right
end

অবশেষে, এখানে উদাহরণ w=4, h=5, s=20এবং w=4, h=5, s=16:


1
পুরো ধারণাটি কেবল একটি এলোমেলো হাঁটা, তাই না?
আকাংকা

সারি 2: You will be drawing a non-self-intersecting random walk... এটি স্ব-ছেদ করা কি না?
edc65

পছন্দ করেছেন এলোমেলো পদচারণা সাধারণত নিজের উপর ডাবল করতে পারে, বা এগুলি একেবারেই ছেদ করতে পারে না। চৌরাস্তা তৈরি হওয়ায় এটি একটি অনন্য ঘটনা তবে এটি একই স্থলটি প্রত্যাহার হিসাবে গণনা করে না। এবং হ্যাঁ এটি অসি-আর্ট ফর্ম্যাট বা অন্য কোনও কিছুতে হতে পারে তবে আমি সুন্দর দেখতে ইমেজ তৈরির ধারণা পছন্দ করি।
ক্যালভিনের

2
@ ক্রিশ্চিয়ান ইরওয়ান আমি ইতিমধ্যে জবাব দিয়েছি যে আমি যখন বলেছিলাম "এবং হ্যাঁ এটি অসি-আর্ট ফর্ম্যাট বা অন্য কোনও কিছুতে হতে পারে তবে আমি দেখতে সুন্দর ছবি তৈরির ধারণা পছন্দ করি।" আমি ascii- শিল্প জড়িত না চয়ন।
ক্যালভিনের

1
"নট" অনুমোদিত?
অদিতসু

উত্তর:


4

সিজেম, 274

q~:K;:B;:A;{0aA*aB*:M5*5f*:I;K{[Bmr:QAmr:P]5f*:R;3Ym*{R.+:)2{1$0=I=2$W=@tI@0=@t:I;}:F~}/R2f+1FK({MQ=P=:EY4mr:D#&1{{MQMQ=PE2D#+tt:M;}:G~7,1>[W0_1_0_W]2/D=:Off*{[QP]5f*2f+.+_:H1F_OW%.+2FOW%.m2F}/H2FO~P+:P;Q+:Q;MQ=P=:E_5YD2%-*=!JK2-=+*1{D2+4%:D;G}?}?}fJ]}0?}g'P2NA5*SI,N2NI:+N*

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

পিবিসি ব্যবহার করে, পিজিএম ফর্ম্যাটে আউটপুট। আপনি :+ব্রাউজারে একটি ভাল ভিজ্যুয়াল আউটপুট পেতে কাছাকাছি শেষ সরাতে পারেন ।

বৃহত্তর ইনপুটটির জন্য এটি খুব ধীর, বিশেষত যদি ধাপ গণনাটি অঞ্চলের কাছাকাছি থাকে।

ইনপুট 4 3 10( উদাহরণস্বরূপ 500%) এর উদাহরণ ফলাফল :

উদাহরণ

সংক্ষিপ্ত বর্ণনা:

সাধারণ পদ্ধতিটি হ'ল:

  • সফল না হওয়া পর্যন্ত নিম্নলিখিত সমস্ত পদক্ষেপগুলি পুনরাবৃত্তি করুন:
  • 2 ম্যাট্রিক্স আরম্ভ করুন: প্রতি কক্ষে কোন পক্ষগুলি ব্যবহৃত হচ্ছে তার একটি রেকর্ডিং এবং চিত্রের জন্য একটি
  • যদি s = 0, আমরা সম্পন্ন করেছি, অন্যথায়:
  • একটি এলোমেলো সেল নির্বাচন করুন এবং একটি বর্গক্ষেত্র আঁকুন, তারপরে নিম্নলিখিত এস -1 বার করুন:
  • একটি এলোমেলো দিক বাছাই; যদি পাশটি ইতিমধ্যে ব্যবহৃত হয়, ব্যর্থ হয়ে আবার শুরু করুন
  • পার্শ্বটি ব্যবহৃত হিসাবে চিহ্নিত করুন এবং চিত্রটিতে আসল পাইপটি আঁকুন (6 টি দৈর্ঘ্যের সংলগ্ন রেখাগুলি আঁকুন, বর্তমান ঘরের কেন্দ্রের পিক্সেলটির "পরে" ডান দিক থেকে শুরু করুন, তারপরে পাইপের শেষটি ক্যাপ করার জন্য একটি বিন্দু যুক্ত করুন)
  • বর্তমান অবস্থান আপডেট করুন (পরবর্তী কক্ষে চলে)
  • ঘরটি ফাঁকা আছে কিনা তা পরীক্ষা করুন বা এটি একটি বৈধ ক্রসিং; যদি না হয় তবে ব্যর্থ হয়ে আবার শুরু করুন
  • এই ঘরে ব্যবহৃত হিসাবে বিপরীত দিকে দিকে চিহ্নিত করুন, তারপরে লুপটি চালিয়ে যান

1

কিউবাসিক, 517 516 বাইট

RANDOMIZE TIMER
SCREEN 9
INPUT w,h,s
1CLS
IF s=0GOTO 9
x=5*INT(RND*w)
y=5*INT(RND*h)
GOSUB 7
FOR k=1TO s-1
r=INT(RND*4)+1
a=x+5*((r=2)-(r=4))
b=y+5*((r=1)-(r=3))
c=(POINT(a,b+2)*POINT(a+4,b+2)+POINT(a+2,b)*POINT(a+2,b+4))*(0=POINT((a+x)\2+2,(b+y)\2+2))
IF((0=POINT(a+2,b+2))+c)*(a>=0)*(b>=0)*(a<5*w)*(b<5*h)=0GOTO 1
x=a
y=b
GOSUB 7
o=1AND r
p=x-2+3*o-5*(r=2)
q=y+1-3*o-5*(r=1)
u=p+3-o
v=q+2+o
LINE(p,q)-(u,v),7,B
LINE(p+o,q+1-o)-(u-o,v-1+o),1
NEXT
9IF c GOTO 1
END
7LINE(x+1,y+1)-(x+3,y+3),7,B
PSET(x+2,y+2),1
RETURN
  • লাগে w, hএবং sব্যবহারকারীর ইনপুট থেকে কমা দ্বারা পৃথক।
  • আউটপুট স্ক্রিনে আঁকা হয়। প্রোগ্রামটি কোনও সমাধান অনুসন্ধান করতে গিয়ে আপনি দেখতে পাচ্ছেন আংশিক সমাধানগুলি অতীতের ঝাঁকুনিতে।
  • পর্যায়ক্রমিক সীমানা শর্ত ব্যবহার করে না। পাইপগুলির সংযোগের জন্য আঁকতে এবং টেস্ট করা আরও সহজ করে পাই যে পাইপের অর্ধেক অংশ গ্রিডের একদিকে এবং অর্ধেক অন্যদিকে থাকা নিয়ে উদ্বিগ্ন না হয়ে p

এখানে পদক্ষেপটি হ'ল প্রতিটি পদক্ষেপে এলোমেলো দিক চেষ্টা করে শুরু থেকে শুরু করা যদি এটির কোনও অবৈধ পদক্ষেপের ফলাফল হয়। দিকনির্দেশগুলি যেমন ঠিক করা হয় তেমন আমরা পাইপগুলি আঁকি এবং POINTআমাদের বৈধতার শর্তের জন্য পর্দায় পয়েন্টগুলি পরীক্ষা করতে ব্যবহার করি । একটি পদক্ষেপ বৈধ হয় যদি এটি গ্রিডের সীমানার বাইরে না যায় এবং:

  1. সরানো-তে ঘরটি খালি; অথবা
  2. উভয়
    1. সরানো-তে ঘরটিতে একটি পাইপ থাকে যা সরাসরি অনুভূমিকভাবে বা উল্লম্বভাবে যায় এবং
    2. নতুন পাইপ বিভাগটি বিদ্যমান পাইপ বিভাগটিকে দ্বিগুণ করে না

অ্যাডিটসুর সিজেএম উত্তরের মতো , এই কোডটি খুব ধীর এবং খুব sউল্লেখযোগ্য ভগ্নাংশ হলে মন-বিবর্ণ ধীর হতে পারে w*h। আমার কিউবি 64 সেটআপে, এটি 5,5,19মোটামুটি তাত্ক্ষণিকভাবে একটি উত্তর নিয়ে আসে , তবে আমি অপেক্ষা করতে ইচ্ছুক চেয়ে বেশি সময় নেয়5,5,20

আপনি যদি বৃহত্তর / আরও ঘন প্যাকযুক্ত উদাহরণগুলি চালাতে চান তবে গভীরতা-প্রথম অনুসন্ধানটি ব্যবহার করে আমার আসল পদ্ধতির এটি এখানে । এটি আরও বেশি দক্ষ, এক বিশাল পরিমাণে 300 অতিরিক্ত বাইটের দামে।

RANDOMIZE TIMER
SCREEN 9
INPUT w,h,s
DIM t(s),m(s)
0
FOR z=1TO s
t(z)=-1
NEXT
i=5*INT(RND*w)
j=5*INT(RND*h)
k=1
1CLS
IF s=0GOTO 9
x=i
y=j
GOSUB 7
FOR z=1TO k-1
r=m(z)
GOSUB 6
x=a
y=b
GOSUB 7
o=1AND r
p=x-2+3*o-5*(r=2)
q=y+1-3*o-5*(r=1)
u=p+3-o
v=q+2+o
LINE(p,q)-(u,v),7,B
LINE(p+o,q+1-o)-(u-o,v-1+o),1
NEXT
IF c*(k=s)THEN k=k-1:GOTO 1 ELSE IF k=s GOTO 9
IF k<1GOTO 0
IF t(k)>=0GOTO 4
t(k)=0
f=30
WHILE f
r=INT(RND*4)+1
IF f AND 2^r THEN t(k)=t(k)*5+r:f=f-2^r
WEND
4r=t(k)MOD 5
m(k)=r
t(k)=t(k)\5
GOSUB 6
c=(POINT(a,b+2)*POINT(a+4,b+2)+POINT(a+2,b)*POINT(a+2,b+4))*(0=POINT((a+x)\2+2,(b+y)\2+2))
IF((0=POINT(a+2,b+2))+c)*(a>=0)*(b>=0)*(a<5*w)*(b<5*h)THEN k=k+1 ELSE IF t(k)>0GOTO 4 ELSE t(k)=-1:k=k-1
GOTO 1
6a=x+5*((r=2)-(r=4))
b=y+5*((r=1)-(r=3))
RETURN
7LINE(x+1,y+1)-(x+3,y+3),7,B
PSET(x+2,y+2),1
RETURN
9

ইনপুটগুলির জন্য আউটপুট উদাহরণ 10, 10, 100, প্রকৃত আকার:10x10 এলোমেলো নদীর গভীরতানির্ণয়

একটি স্থির কল্পনাকারী সংস্করণে পাওয়া যাবে এই সারকথা । নিরবচ্ছিন্ন এবং পুঙ্খানুপুঙ্খভাবে মন্তব্য করা ছাড়াও, এটি একটি ধ্রুবক ফ্যাক্টর দ্বারা আউটপুটকে স্কেল করে এবং পদক্ষেপের মধ্যে একটি সেট বিলম্বের অনুমতি দেয়, আপনাকে কাজের জায়গায় ডিএফএস অ্যালগরিদম দেখতে সক্ষম করে। এখানে একটি উদাহরণ রান করুন:

কর্মের মধ্যে ডিলাক্স নদীর গভীরতানির্ণয়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.