সি # - 897 862 বাইট
এটি এমন জায়গাগুলিতে আয়না লাগিয়ে একটি গুরুতর ত্রুটি পেয়েছিল যা তারা হতে পারে না। এখন এটি কাজ করে, আশা করি! কিছুটা হালকা গল্ফিং করেছে, কিছুক্ষণ লুপটি সেখানে leaveুকতে পারে না ... লজ্জাজনক।
সম্পূর্ণ প্রোগ্রাম, STDIN থেকে ইনপুট নেয়, STDOUT এ আউটপুট নেয়।
এটি অনেক মজার ছিল, এটি 7 বাই 5 সমস্যার সমাধান করে (এবং যখন আপনি একটি আয়না অপসারণ করেন, এটি অসম্ভব করে তোলে) 30 কে 5 এর সমাধান করতে প্রায় 1 ঘন্টা সময় নিয়েছিল।
using Q=System.Console;class P{static int w,L;static string S(char[]M,int t,int r,int i,int d,int[]B){var s="";if(r<0)return s;M=(char[])M.Clone();B=(int[])B.Clone();B[i]=1;for(i+=d;M[t]<48|t==i;i=t+(d=t<w?w:t>L-w?-w:t%w<1?1:-1))if(++t>=L){for(i=0;++i<L&r>0;)if(B[i]<1&M[i]<33){M[i]='.';r--;}return r<1?new string(M):s;}int c=M[i];if(c>32)s=c>47|c<46?s=c==M[t]?S(M,t,r,t,0,B):s:S(M,t,r,i,c<47?w/d:-w/d,B);else if((s=S(M,t,r,i,d,B))==""&B[i]<1){M[i]='.';s=S(M,t,r-1,i,w/d,B);if(s==""){M[i]='/';s=S(M,t,r-1,i,-w/d,B);}}return s;}static void Main(){string a,A="",R=A;for(;(a=Q.ReadLine())!=null;A+=a)L+=(w=a.Length);var G=A.ToCharArray();int r=0,i=L;for(;i>0;G[i]=G[i]=='|'?',':G[i])if(G[--i]==47|G[i]==92){r++;G[i]=' ';}a=S(G,0,r,1,w,new int[L]);if(a=="")R="Impossible\n";else for(;i<L;i+=w)R+=a.Substring(i,w)+"\n";Q.Write(R.Replace(".","\\").Replace(",","|"));}}
5 দ্বারা 7 উদাহরণ:
+abcde+
f/////d
a// c
f |
+-b-e-+
+abcde+
f \ d
a/ //c
f/ \ /|
+-b-e-+
অসম্ভব সংস্করণ:
+abcde+
f ////d
a// c
f |
+-b-e-+
Impossible
কিছু অন্যরকম (প্রোগ্রামটি মূল আয়না বিন্যাসটিকে দেখায় না):
+a----+
|//// |
|/////|
|/////|
+----a+
+a----+
| /\\\|
|\\\\\|
|\\/\\|
+----a+
30 দ্বারা 5 সমাধান:
+abcdefghijklmnopqrstuvwxyA-+
| \\\\\\\\\\\\\\\\\\\\\\\\ \|
| / //|
|\ \|
+-Abcdefghijklmnopqrstuvwxya+
এটি প্রতিটি লেজার উত্সকে ঘুরে দেখায় এবং এর জন্য একটি বৈধ রুট তৈরি করে (যদি এটি পারে) এবং তারপরে পরবর্তী দিকে চলে যায়। এটি একটি দুর্দান্ত সরল গভীরতার-প্রথম অনুসন্ধান, যা কোন লেজার উত্স (লক্ষ্য) এটি সন্ধান করছে তা জানতে হবে, এটির জন্য এটি কত আয়না রাখবে, বর্তমান সেলটি এটি "এ" রয়েছে, এটি যে দিকে চলেছে এবং প্রতিটি ঘর এটি ইতিমধ্যে পরিদর্শন করা হয়েছে (যাতে এটি কোথাও এটি ইতিমধ্যে হয়েছে এমন কোনও আয়না না ফেলে)। সর্বশেষ 3 টি বর্তমান টার্গেটের জন্য পাথ জমা করার জন্য এবং লক্ষ্য পরিবর্তিত হয়ে গেলে পুনরায় সেট করার জন্য ব্যবহৃত হয়। সমস্ত লেজারগুলি সংযুক্ত হয়ে গেলে, এটি এগিয়ে যায় এবং কোনও ফাঁক পূরণ করে এটি খালি রাখার প্রয়োজন হয় না (এটি দেখার জন্য যেখানেই সর্বত্র এটি জানা দরকার)।
এটি যখন রুটগুলি তৈরি করে, এটি একটি আয়না tingোকানোর চেয়ে "এগিয়ে" যাওয়ার পক্ষে এবং এটি যখন হয় তখন এটি একটি "\" আয়নাটিকে সমর্থন করে - এটি উপরের "আলাদা কিছু" উদাহরণে সর্বাধিক দেখা যায়, যেখানে এটি নীচের প্রথম কক্ষটি এড়িয়ে যায় সর্বাধিক সর্বাধিক 'এ', তারপরে ক্রমাগত একটি "\" পূরণ করে যদি এটির সাথে কোনও সমাধান খুঁজে পাওয়া যায়, অন্যথায় একটি "/" (স্বাভাবিকভাবেই, যদি প্রথম কক্ষটি এড়িয়ে যাওয়ার ফলে এটি সমাধান খুঁজে পেতে অক্ষম হয়, তবে এটি হবে) পিছনে ট্র্যাক করুন এবং পরিবর্তে সেখানে একটি আয়না রাখার চেষ্টা করুন)।
using Q=System.Console;
class P
{
static int w,L;
// M is cur grid
// t is target edge thing (0->L)
// r is mirrors remaining
// i is pos
// d is dir
static string S(char[]M,int t,int r,int i,int d,int[]B)
{
var s="";
if(r<0) // no mirrors left
return s;
// clone everything
M=(char[])M.Clone();
B=(int[])B.Clone();
B[i]=1; // can't write to this
for(i+=d; // move i
M[t]<48|t==i; // only if target is something sensible (increment if i==t)
i=t+(d=t<w?w:t>L-w?-w:t%w<1?1:-1)) // reflect, should be fine for w=3
if(++t>=L) // run off the end
{
for(i=0;++i<L&r>0;) // don't need I any more (count through everything)
if(B[i]<1&M[i]<33) // not been here & it's open space
{
M[i]='.'; // doesn't matter
r--;
}
return r<1?new string(M):s; // none remaining ? victory : defeat
}
int c=M[i];
if(c>32) // not boring
s=c>47|c<46? // hit edge
s=c==M[t]? // hit the correct thing
S(M,t,r,t,0,B): // i+0=t, tells it to increment t
s
:S(M,t,r,i,c<47?w/d:-w/d,B); // mirror
else // boring
if((s=S(M,t,r,i,d,B))==""&B[i]<1) // fwd
{
M[i]='.'; // use . instead of \
s=S(M,t,r-1,i,w/d,B); // \
if(s=="")
{
M[i]='/';
s=S(M,t,r-1,i,-w/d,B); // /
}
}
return s;
}
static void Main()
{
string a,A="",R=A; // R is free
for(;(a=Q.ReadLine())!=null;A+=a) // read input
L+=(w=a.Length); // note width, accumulate length
var G=A.ToCharArray();
int r=0,i=L; // count mirrors (I refuse to make these static)
for(;i>0; // end on i=0
G[i]=G[i]=='|'?',':G[i]) // replace | with ,
if(G[--i]==47|G[i]==92) // remove and count mirrors
{
r++;
G[i]=' '; // storing G[i] doesn't seem to save anything
}
// search
a=S(G,0,r,1,w,new int[L]);
if(a=="") // defeat
R="Impossible\n";
else // victory
for(;i<L;i+=w) // for each line
R+=a.Substring(i,w)+"\n";
Q.Write(R.Replace(".","\\").Replace(",","|")); // swap back | and \
}
}