• 0
khatibe_30

لغز برمجي, التحدي مفتوح بأي لغة برمجة

سؤال

السلام عليكم أعزائي, مرحبا بكم

أقدم لكم مسألة حسابية (مشكلة) و المطلوب إيجاد الحل البرمجي لها.

المعطيات:

نفترض أنه لدينا 3 أنابيب بسعة متساوية, سعة كل أنبوب 6 لتر, و وعاءين (2 وعاء) نستخدمهما لنملأ الأنابيب بالماء, في كل مرة نسكب الماء في أنبوب ما من الأنابيب (الترتيب غير مهم) باستخدام أحد الأوعية إلى أن نملأ كل الأنابيب.

الوعاء الأول سعته 3 لترات, و الوعاء الثاني سعته 2 لترات.

الشرط الوحيد الذي يجب أن نتقيد به هو أن لا نجد مستوى الماء متساوي في أنبوبين متجاورين أثناء أي مرحلة من العملية, مثلا أنظر إلى الصورة:

719119421.png

العملية على اليسار صحيحة, لأنه لا يوجد أنبوبين متجاورين لهما نفس المستوى من الماء

العملية على اليمين, غير مسموح القيام بها, الأنبوب الثاني و الثالث لهما نفس المستوى, لذلك يجب أن نتوقف.

إذن, يجب أن نملأ الأنابيب, نسكب كمية من الماء باستعمال أحد الأوعية في كل أنبوب إلى أن نملأه باستخدام مجموعة من الأوعية, على شرط عدم وصول الماء لنفس المستوى في أنبوبين متجاورين, في المثال السابق, من أجل 3 أنابيب, سعة كل أنبوب 6 لترات, يوجد طريقتين لملأ الأنابيب كما في الصورة:

683632173.png

الطريقة الأولى, على اليسار: الأنبوب الأول 3-3, الأنبوب الثاني 2-2-2, الأنبوب الثالث 3-3

الطريقة الثانية, على اليمين: الأنبوب الأول 2-2-2, الأنبوب الثاني 3-3, الأنبوب الثالث 2-2-2

و من أجل 3 أنابيب, سعة كل أنبوب 8 لترات, يوجد 4 طرق, و هذه إحدى الطرق في الصورة:

2-3-3, 3-3-2, 2-3-3

473251544.png

في حين أن العملية التالية خاطئة:

3-3-2, 2-2-2-2, 3-2-3

776692695.png

خلال العملية, نلاحظ أن الأنبوب الثاني و الثالث يمكن أن يكون الماء فيهما في نفس المستوى باستعمال سلسلة الأوعية المعطاة لكل أنبوب.

المطلوب:

أوجد عدد الطرق التي يمكن أن نملأ بها 10 أنابيب, سعة كل أنبوب 32 لتر, يمكنك أن تستعمل أي لغة برمجة تريد في كتابة الكود الذي سيقوم بالحساب.

أي, من أجل N = 10 و L = 32 كم يوجد من عدد الطرق ملأ الأنابيب؟

الأفضل أن تكتب الكود الذي سيعمل في الحالة العامة, من أجل عدد أنابيب N, كل أنبوب بسعة L لترات, أوجد عدد الطرق التي يمكن أن نملأ بها الأنابيب.

معطيات مساعدة:

إليك هذه النتائج المحسوبة مسبقا:

من أجل N = 3 و L = 8 هناك 4 طرق

من أجل N = 3 و L = 9 هناك 8 طرق

من أجل N = 5 و L = 10 هناك 28 طريقة

من أجل N = 6 و L = 13 هناك 452 طريقة

من أجل N = 5 و L = 16 هناك 1796 طريقة

ملاحظة: قبل أن أكتب الموضوع أجريت بحثا في المنتدى حتى أتجنب التكرارا و لم أجد موضوعا مشابه, لذلك, إذا كان الموضوع مكررا فأرجو حذفه و إبلاغي.

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

41 إجابة على هذا السؤال .

  • 0

حتى لايُفهم تأخري هروباً ...أخي ياسين ... أنا أعمل على الكود كأولوية ...

وأنهيت حتى الآن الجزء الخاص بإيجاد الاحتمالات بالنسبة لأنبوب واحد .. وحالياً سينتهي الجزء الذي يحدد الأنابيب القابلة للوضع بالقرب من بعضها ...

ولكن عندما أفكر في الجزء الأخير ..أرى أنني سأدخل في متاهة كبيرة من الاحتمالات ...

سيكون لدي ببساطة .. كل أنبوب مع الاحتمالات الصحيحة بعده .. وكل أنبوب منها سيفتح احتمالات بعده وهكذا ل10 مستويات .. أخشى ألا أضيع بين الأنابيب ...

ربما يوم الجمعة يكون الحل جاهزاً إن شاء الله تعالى...

بالتوفيق للجميع وأنتظر حل أخي linuxman لنرى من سيسبق في الحل laugh.gif

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

حتى لايُفهم تأخري هروباً ...أخي ياسين ... أنا أعمل على الكود كأولوية ...

وأنهيت حتى الآن الجزء الخاص بإيجاد الاحتمالات بالنسبة لأنبوب واحد .. وحالياً سينتهي الجزء الذي يحدد الأنابيب القابلة للوضع بالقرب من بعضها ...

ولكن عندما أفكر في الجزء الأخير ..أرى أنني سأدخل في متاهة كبيرة من الاحتمالات ...

سيكون لدي ببساطة .. كل أنبوب مع الاحتمالات الصحيحة بعده .. وكل أنبوب منها سيفتح احتمالات بعده وهكذا ل10 مستويات .. أخشى ألا أضيع بين الأنابيب ...

ربما يوم الجمعة يكون الحل جاهزاً إن شاء الله تعالى...

بالتوفيق للجميع وأنتظر حل أخي linuxman لنرى من سيسبق في الحل laugh.gif

خذ وقتك و على راحتك يا مصطفى, على ما أذكر أنا فتحت هذه المسألة عندما وجدتها باستخدام bruit force و بمسح كل الاحتمالات و النتيجة في جزء من الثانية, ربما تستطيع أن تجد لنا صيغة رياضية أفضل.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لا تنتظر كثيرا يا مصطفى فقد وصلت للحل قبلك وهذه الخوارزمية تحسب احتمالات التقاء أنبوبين وناتجها هو عين ما ذكره الأخ الخطيب 37120

وليس بصعب مضاعفة الأنابيب إلى أن تصل إلى عشرة ما دام أصل الخوارزمية صحيحا

ولكن عيبها أنها تعتمد على brut force ومع عشرة أنابيب سيأخذ ذلك وقتا طويلا فإن كنت على صواب فسأكمل الخوارزمية إلى عشرة أنا بيب ولكن لست مستعدا لتجربتها على جهازي لضعف إمكانياته وهذه هي

مع تعديلات وإصلاح للخطأ الذي كان فيها


function calcul:integer;
var i,j,x,h,f:integer;
a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16:byte;
table,addTable:array[1 .. 3329,1 .. 16] of byte;
test:Boolean=false;
begin
i:=1; x:=0;
for a1:=2 to 3 do
for a2:=2 to 3 do
for a3:=2 to 3 do
for a4:=2 to 3 do
for a5:=2 to 3 do
for a6:=2 to 3 do
for a7:=2 to 3 do
for a8:=2 to 3 do
for a9:=2 to 3 do
for a10:=2 to 3 do
for a11:=2 to 3 do
for a12:=2 to 3 do
for a13:=2 to 3 do
for a14:=2 to 3 do
for a15:=2 to 3 do
for a16:=2 to 3 do
begin
if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15+a16=32 then
begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16])<> wr then
begin
wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16]);
table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
table[i,12]:=a12;table[i,13]:=a13;table[i,14]:=a14;table[i,15]:=a15;table[i,16]:=a16;
i:=i+1; h:=16; test:=true; end ;
end
else
if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15=32 then
begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15])<> wr then
begin
wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15]);
table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
table[i,12]:=a12;table[i,13]:=a13;table[i,14]:=a14;table[i,15]:=a15;
i:=i+1; h:=15; test:=true;end ;
end
else
if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14=32 then
begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14])<> wr then
begin
wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14]);
table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
table[i,12]:=a12;table[i,13]:=a13;table[i,14]:=a14;
i:=i+1; h:=14; test:=true; end ;
end
else
if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13=32 then
begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13])<> wr then
begin
wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13]);
table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
table[i,12]:=a12;table[i,13]:=a13;
i:=i+1; h:=13; test:=true; end ;
end
else
if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12=32 then
begin if format('%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12])<> wr then
begin
wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12]);
table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
table[i,12]:=a12;
i:=i+1; h:=12; test:=true; end ;
end
else
if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11=32 then
begin if format('%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11])<> wr then
begin
wr:=format('%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11]);
table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
i:=i+1; h:=11; test:=true; end ;
end ;
if test then
for j:=1 to h do
begin
x:=x+table[i-1,j];
addTable[i-1,j]:=x;
end;
x:=0;
test:=false;
end;
for i:=1 to 3329 do
for f:=1 to 3329 do
begin
test:=false;
for j:=1 to 15 do
for h:=1 to 15 do
if (addtable[f,h] <> 0) and (addtable[f,h] <> 32) and (addtable[f,h]= addtable[i,j]) then
test:=true;
if test=false then begin result:=result+1 ; end;
end;
end; //end of function

أنا أعلم أنها ليست الأفضل لذلك أنا أنتظر حل الأخ الخطيب الذي قال أنه حلها في جزء من الثانية

تم تعديل بواسطه linuxman
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مادامت البداية صحيحة فالباقي سيكون صحيح, و لكن وقت التنفيذ عامل مهم جدا, أكواد bruite force يمكن أن تأخذ عشرات السنين حتى تصل الى نتيجة في الحالات الكبيرة

لذلك, اذا كانت طريقتك بعد تعميمها على 10 أنابيب على الأقل تجد النتيجة في أقل من ثانية فهي طريقة مقبولة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
لا تنتظر كثيرا يا مصطفى فقد وصلت للحل قبلك وهذه الخوارزمية تحسب احتمالات التقاء أنبوبين وناتجها هو عين ما ذكره الأخ الخطيب 37120

smile.gifينتهي التحدي عندما يضع أحدنا عدد الاحتمالات الكي ويكون صحيحاً ....wink.gif

انتهيت من كتابة الجزء الخاص بإيجاد ثنائيات الأنابيب القابلة للوضع قرب بعضها ...

يعني الآن يمكنني تشكيل كل السلاسل الممكنة ...

اقتربت كثيراً ...باقي بضعة أسطر وأنتهي (ربما 20سطر فقط)...

وأرجو أن أسبقك أخي linuxman في وضع الحل laugh.gif

بالتوفيق لك وللجميع أخي العزيز

_________________________

الحمد لله وصلت إلى عدد احتمالات انبوبين 37120 استغرق حوالي ... 17 ثانية laugh.giflaugh.giflaugh.gif

والحل الأخير قادم اليوم بإذن الله تعالى

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

سلام عليك

أنبوبان أو ثلاثة أو عشرة .......

إذا صح المبدأ فالكل سواء وإن أردت إلا عشرة فهاكها ولكنها ستأخذ وقتا طويلا في عملها حسب الجهاز الذي لديك

غاية أمري أني زدت حلقات الاختبار إلى عشرة

والوقت المسجل لدي في أنبوبين هو ما يقارب 20 ثانية

وهذه هي


function calcul:integer;
var i,j,x,h,f,r,g,z:integer;
a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16:integer;
j1,j2,j3,j4,j5,j6,j7,j8,j9,j10:integer;
table,addTable:array[1 .. 3329,1 .. 16] of byte;
test:Boolean=false;
id:array[2 .. 30,1 .. 3329] of integer;
count,count2:real;
powr:array[2 .. 30] of real;
wr,srt:string;
begin
i:=1; x:=0;
for a1:=2 to 3 do
for a2:=2 to 3 do
for a3:=2 to 3 do
for a4:=2 to 3 do
for a5:=2 to 3 do
for a6:=2 to 3 do
for a7:=2 to 3 do
for a8:=2 to 3 do
for a9:=2 to 3 do
for a10:=2 to 3 do
for a11:=2 to 3 do
for a12:=2 to 3 do
for a13:=2 to 3 do
for a14:=2 to 3 do
for a15:=2 to 3 do
for a16:=2 to 3 do
begin
if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15+a16=32 then
begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16])<> wr then
begin
wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16]);
table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
table[i,12]:=a12;table[i,13]:=a13;table[i,14]:=a14;table[i,15]:=a15;table[i,16]:=a16;
i:=i+1; h:=16; test:=true; end ;
end
else
if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15=32 then
begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15])<> wr then
begin
wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15]);
table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
table[i,12]:=a12;table[i,13]:=a13;table[i,14]:=a14;table[i,15]:=a15;
i:=i+1; h:=15; test:=true;end ;
end
else
if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14=32 then
begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14])<> wr then
begin
wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14]);
table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
table[i,12]:=a12;table[i,13]:=a13;table[i,14]:=a14;
i:=i+1; h:=14; test:=true; end ;
end
else
if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13=32 then
begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13])<> wr then
begin
wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13]);
table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
table[i,12]:=a12;table[i,13]:=a13;
i:=i+1; h:=13; test:=true; end ;
end
else
if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12=32 then
begin if format('%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12])<> wr then
begin
wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12]);
table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
table[i,12]:=a12;
i:=i+1; h:=12; test:=true; end ;
end
else
if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11=32 then
begin if format('%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11])<> wr then
begin
wr:=format('%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11]);
table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
i:=i+1; h:=11; test:=true; end ;
end ;
if test then
for j:=1 to h do
begin
x:=x+table[i-1,j];
addTable[i-1,j]:=x;
end;
x:=0;
test:=false;
end;
for a1:=1 to 3329 do
for a2:=1 to 3329 do
for a3:=1 to 3329 do
for a4:=1 to 3329 do
for a5:=1 to 3329 do
for a6:=1 to 3329 do
for a7:=1 to 3329 do
for a8:=1 to 3329 do
for a9:=1 to 3329 do
for a10:=1 to 3329 do
begin
test:=false;
for j1:=1 to 15 do
for j2:=1 to 15 do
for j3:=1 to 15 do
for j4:=1 to 15 do
for j5:=1 to 15 do
for j6:=1 to 15 do
for j7:=1 to 15 do
for j8:=1 to 15 do
for j9:=1 to 15 do
for j10:=1 to 15 do
if (addtable[f,h] <> 0) and (addtable[f,h] <> 32) then
if(
addtable[a1,j1]= addtable[a2,j2]) or
(addtable[a2,j2]= addtable[a3,j3]) or
(addtable[a3,j3]= addtable[a4,j4]) or
(addtable[a4,j4]= addtable[a5,j5]) or
(addtable[a5,j5]= addtable[a6,j6]) or
(addtable[a6,j6]= addtable[a7,j7]) or
(addtable[a7,j7]= addtable[a8,j8] )or
(addtable[a8,j8]= addtable[a9,j9]) or
(addtable[a9,j9]= addtable[a10,j10]
) then
test:=true;
if test=false then begin result:=result+1 ; end;
end;
end; //end of function

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بارك الله فيك هل تأكدت من صحة الإجابة ... smile.gif؟؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لا ما جربتها لأنها ستأخذ أياما .... :sad: ولكن أنا على يقين بصحتها ومع ذلك التحدي لا يزال قائما لتحسين الخوارزمية

تم تعديل بواسطه linuxman
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
ا ومع ذلك التحدي لا يزال قائما لتحسين الخوارزمية

بل التحدي لإيجاد الجواب ...laugh.gif

أنا انتهيت تقريبا باقي بعض الرتوش هنا وهناك ... حوالي ساعة على الأكثر إن شاء الله تعالى ...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

سلام عليك

أنبوبان أو ثلاثة أو عشرة .......

إذا صح المبدأ فالكل سواء وإن أردت إلا عشرة فهاكها ولكنها ستأخذ وقتا طويلا في عملها حسب الجهاز الذي لديك

غاية أمري أني زدت حلقات الاختبار إلى عشرة

والوقت المسجل لدي في أنبوبين هو ما يقارب 20 ثانية

هذا الكود, نظريا صحيح و سيعطي نتيجة, و لكن عمليا, لا يمكن أن يعطيك نتيجة

إذا كانت نتيجة أنبوبين و هي -حسب طريقتك- عبارة عن 33292عملية تحقق من توافق الأنابيب تأخذ معك 1 ثانية فقط و ليس 20

فإن التحقق من 10 أنابيب و الذي سيكون -حسب طريقتك- عبارة عن 332910عملية تحقق

أي سيكون 33292 * 33298 عملية تحقق من توافق الانابيب

و سيأخذ من الوقت 1*33298 ثانية

و هذا أكثر من 478303715279 مليار سنة حسب حساباتي

حتى باستعمال سوبر سوبر سوبر كومبيوتر فسيأخذ هذا الكود حتى يجد حلا عشرات أو مئات ملايين السنين و ربما أكثر بكثير

تم تعديل بواسطه khatibe_30
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الحمد لله ... والله أن عيني تدمع ... على ما أنعم الله علي ..ثم لا أقابل الإحسان إلا بالمعاصي والذنوب ...

إخواني ادعولي بالمغفرة ... والله نعم الله تعالى تغمرني من كل صوب ... اللهم هب لنا من لدنك رحمة وهيّئ لنا من أمرنا رشداً ...

ولا حول ولا قوة إلا بالله العلي العظيم ...

_______________________________________

أخي ياسين ..

جواب سؤالك هو :806844323190414

ولله الحمد ...

الكود طويل ومعقد ... ولكنه يحل المشكلة بإدخال L,N وهو يكمل الباقي ...

أمامي خياران ...

أن أضع الكود الآن ..وأعدك أني لن أفكر في العودة إليه مرة أخرى ...

أو أن أضع الكود مع الشرح الوافي والكافي بإذن الله تعالى ...

وشرح للخوارزمية ..بعد حوالي أسبوع من الآن ....

فما قولك ....

جزاك الله خيراً...فقد استخدمت كل ما أعطانيه الله تعالى من علم في حل هذه المسألة ... واستغرقت معي 4 أيام من التفكير المتواصل ...(يعني حوالي 2-3 ساعات من يومي )

أسأل الله أن يرزقني عملاً صالحاً مخلصاً ...

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جواب سؤالك هو :806844323190414

ولله الحمد ...

الكود طويل ومعقد ... ولكنه يحل المشكلة بإدخال L,N وهو يكمل الباقي ...

أمامي خياران ...

أن أضع الكود الآن ..وأعدك أني لن أفكر في العودة إليه مرة أخرى ...

أو أن أضع الكود مع الشرح الوافي والكافي بإذن الله تعالى ...

وشرح للخوارزمية ..بعد حوالي أسبوع من الآن ....

فما قولك ....

جزاك الله خيراً...فقد استخدمت كل ما أعطانيه الله تعالى من علم في حل هذه المسألة ... واستغرقت معي 4 أيام من التفكير المتواصل ...(يعني حوالي 2-3 ساعات من يومي )

أسأل الله أن يرزقني عملاً صالحاً مخلصاً ...

أجل, تهانينا, الحل صحيح :happy: :happy:

أعتقد أن حلك = حل linuxman + إضافة مميزة (و هي مفتاح اللغز)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وين راحت الجماعة نحن ننتظر الحل بعد ما تركت التفكير فيها لكثرة مشاغلي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أظن أن الأخ مصطفى غائب,

هذا حل مصطفى:

#include<cstdio>
int num(int a)
{
if(a==1)
return 0;
else if(a==2)
return 1;
else if(a==3)
return 1;
else return num(a-2)+num(a-3);
}
int number=0;
class tree
{
private:
int value;
int ID;
tree*prev;
tree*next1;
tree*next2;
public:
tree(int);
tree(int,tree*);
int treesize(int);
int getleaf(int,int);
};
tree **b;
tree:: tree(int a)
{
value=a;
next1=new tree(value-2,this);
next2=new tree(value-3,this);
}
tree:: tree(int a,tree*b)
{
value=a;prev=b;
if(a==1)
value=0;
else if(a!=2&&a!=3)
{
next1=new tree(value-2,this);
next2=new tree(value-3,this);
}
else if(a==2||a==3)
{
ID=number++;
::b[ID]=this;
}
}
int tree::treesize(int end)
{
tree *buffer=this;
int i;
for(i=0;buffer->value!=end;i++)
buffer=buffer->prev;
return i;
}
int tree::getleaf(int end,int j)
{
tree *buffer=this;
int i;
for(i=0;buffer->value!=end;i++)
{
if(i==j)return buffer->value;
buffer=buffer->prev;
}
return 0;
}
typedef char Byte;
bool linearsearch(int *a,int size,int target)
{
for(int i=0;i<size;i++)
if(a[i]==target)return 1;
return 0;
}
int **series;
int *counterSeries;
void initseries(int L)
{
series=new int*[num(L)];
counterSeries=new int[num(L)];
}
void wich_next(int**c,int L)
{
initseries(L);
int Size=num(L);
int counter=Size,counter2=Size;
int i,j,k;
int indeX=0;
for(i=0;i<num(L);i++)
{
series[i]=new int[Size];
counter=Size,counter2=Size;
for(j=0;j<Size;j++)series[i][j]=j;
for(j=0;j<b[i]->treesize(L);j++)
{
for(k=0;k<counter2;k++)
{
if(
linearsearch
(c[series[i][k]],
b[series[i][k]]->treesize(L),
c[i][j]))
{series[i][k]=-1;counter--;}
}
int *buffer=new int[counter];
int index=0;
for(k=0;k<counter2;k++)
if(series[i][k]!=-1)
buffer[index++]=series[i][k];
series[i]=buffer;
counter2=counter;
}counterSeries[indeX++]=counter;
}
}
main()
{
unsigned int L;
unsigned int N;
printf("Enter L :");scanf("%u",&L);
printf("Enter N :");scanf("%u",&N);
b=new tree*[num(L)];
tree a(L);
int i,j,k;
int**c=new int*[num(L)];
for(i=0;i<num(L);i++)
{
int X=b[i]->treesize(L);
c[i]=new int[X];
for(int j=0;j<X;j++)
c[i][j]=b[i]->getleaf(L,j);
}
wich_next(c,L);

long long **array;
array=new long long*[N];
array[0]=new long long[num(L)];
for(j=0;j<num(L);j++)array[0][j]=1;
for(i=1;i<N;i++)
{
array[i]=new long long[num(L)];
for(k=0;k<num(L);k++)array[i][k]=0;
for(j=0;j<num(L);j++)
{
for(k=0;k<counterSeries[j];k++)
array[i][series[j][k]]+=array[i-1][j];
}
}
long long int SUPERSUM=0;
SUPERSUM=0;
for(i=0;i<num(L);i++)SUPERSUM+=array[N-1][i];
printf("%llu\n",SUPERSUM);
return 0;
}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

linuxman

الكود الذي كتبته أنت ينقصه شيء واحد حتى يتم تنفيذه في وقت معقول, و هو تخزين النتائج

تلاحظ أنه يوجد الكثير الكثير من الحسابات التي تتكرر

مثلا إذا وصلت ألى الأنبوب رقم 2, و كانت الطريقة الحالية لملء الأنبوب هي رقم r من الطرق 3329, طبعا ستحسب الطرق التي توافقها في الأنبوب 3 و الطرق التي توافق الطرق التي توافقها في الانبوب 4...الخ الى ان تصل الى الانبوب 10

لذلك, يجب أن تقوم بتخزين هذه النتائج في مصفوفة مثلا

m(2, r) = result;

و عندما تعود إلى الحلقة الأولى و تبدأ عملية التحقق من الأنبوب الثاني, فإنك قبل أن تدخل في حلقة أخرى, ستتحقق هل تم حساب هذه النتيجة التي ستقوم بحسابها مسبقا او لا

اذا سبق و حسبتها, استعمل النتيجة المخزنة و اخرج من الحلقة و انتقل الى الحالة الموالية و هكذا

تم تعديل بواسطه khatibe_30
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
أظن أن الأخ مصطفى غائب,

جزاك الله خيراً أخي ياسين ... أعتذر لغيابي فقد انقطع الاتصال نهائياً ..عندنا ... أرجو العودة قريباً ...

وأكرر شكري لك ... لوضعك الحل .. فلا شيء مغلق هنا laugh.giflaugh.gif

والسلام عليكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .