বোমা ড্রপ অ্যালগরিদম


212

n x mঅ-নেতিবাচক পূর্ণসংখ্যার সমন্বয়ে আমার একটি ম্যাট্রিক্স রয়েছে। উদাহরণ স্বরূপ:

2 3 4 7 1
1 5 2 6 2
4 3 4 2 1
2 1 2 4 1
3 1 3 4 1
2 1 4 3 2
6 9 1 6 4

"একটি বোমা ফেলে" লক্ষ্য কক্ষের সংখ্যা এবং তার আটটি প্রতিবেশী, সর্বনিম্ন শূন্যের দ্বারা হ্রাস পায়।

x x x 
x X x
x x x

এমন একটি অ্যালগরিদম কী যা সমস্ত কোষকে শূন্যে হ্রাস করতে প্রয়োজনীয় ন্যূনতম বোমার সংখ্যা নির্ধারণ করতে পারে?

বি বিকল্প (আমার যত্নশীল পাঠক না হওয়ার কারণে)

আসলে সমস্যার প্রথম সংস্করণ হ'ল আমি যার উত্তর চাইছি। আমি সাবধানতার সাথে পুরো টাস্কটি পড়িনি, অতিরিক্ত বাধা রয়েছে, আসুন আমরা বলতে পারি:

সাধারণ সমস্যা সম্পর্কে কী, যখন সারি ক্রমটি ক্রমবর্ধমান হয়:

8 7 6 6 5 সম্ভব ইনপুট ক্রম

7 8 5 5 2 ক্রমানুসারে 7 -> 8 বাড়ার পর থেকে এটি সম্ভব নয়।

"সহজ" মামলার উত্তর খুঁজে পাওয়া আরও শক্তির সমাধান সমাধানে সহায়তা করবে।

পিএস: আমি বিশ্বাস করি যে যখন আমাদের বেশ কয়েকটি একই পরিস্থিতিতে উপরের লাইনটি সাফ করার জন্য ন্যূনতম বোমার প্রয়োজন হয়, তখন আমরা এমন একটি নির্বাচন করি যা সারিটির "বাম পাশে" বেশিরভাগ বোমা ব্যবহার করে। এখনও কোন প্রমাণ যে সঠিক হতে পারে?


4
আমি ঠিক দেখতে পেয়েছি যে কিছু ক্ষেত্রগুলি উদাহরণস্বরূপ 2 2 1 5 5 এ ফেলে দেওয়া অর্থহীন, কারণ সেগুলি নেমে যাওয়া কিছু উপসেট ক্ষতি ডেকে আনে যা আমরা 5 এ নামিয়ে ফেলতে পারি But কীভাবে এটি বিশ্বব্যাপী কাজ করতে হয় তা সন্ধান করুন (যদি এটি সঠিক উপায়ে হয়)। ক্লিয়ারিং 2 এর জন্য প্রতিবেশী যে কোনও ব্যক্তির উপর 2 টি বোমা ফেলে দেওয়া প্রয়োজন এবং 5 টিতে অন্যান্য সেটগুলির ক্ষতির পরিমাণ রয়েছে। তবে আমি পরে জানি না যেহেতু আপনি যখন এটি পুনর্লিখন করবেন (হ্রাস হওয়ার পরে), তখন আপনার দুটি পছন্দ আছে (ক্ষতির কোনও সেট নেই)।
abc

23
এটি কি কোনও সুযোগে এনপি-হার্ড? এটি সর্বোচ্চ কভারেজ সমস্যার একটি রূপ বলে মনে হচ্ছে ।
রহস্যময়

14
আমাকে ভাবতে আগ্রহী কিছু দেওয়ার জন্য +1
নিক মিচিনসন

3
@ কোস্টেক, দুর্দান্ত সমস্যা! লিঙ্কটি পোস্ট করুন।
কর্নেল আতঙ্ক

5
সম্ভবত আপনার স্পষ্ট করা উচিত, আপনি প্রশ্নটি বলেছেন: এর what's the minimum amount of bombs required to clean the board?অর্থ কি এটির সত্যিকারের বোমা বোদ্ধার সন্ধানের প্রয়োজন হয় না, তবে কেবল বোমা সংখ্যার ন্যূনতম সংখ্যা?
মিথ্যা রায়ান

উত্তর:


38

এটি একটি সাধারণ সাব-সমস্যায় হ্রাস করার একটি উপায় রয়েছে।

ব্যাখ্যার 2 টি অংশ রয়েছে, অ্যালগরিদম এবং কারণটি অ্যালগরিদম একটি অনুকূল সমাধান সরবরাহ করে। প্রথমটি দ্বিতীয়টি ছাড়া কোনও অর্থবোধ করে না, সুতরাং আমি কেন এটি দিয়ে শুরু করব।

আপনি যদি আয়তক্ষেত্রটি বোমা ফেলার কথা ভাবেন (বড় আয়তক্ষেত্রটি ধরে রাখুন - এখনও কোনও প্রান্তের কেস নেই) আপনি দেখতে পাচ্ছেন যে ঘেরের স্কোয়ারের ফাঁপা আয়তক্ষেত্রকে 0 থেকে হ্রাস করার একমাত্র উপায় হল পরিধিটি বোমা দেওয়া বা এর ফাঁকা আয়তক্ষেত্রটি বোমা করা is ঘেরের ভিতরে স্কোয়ারগুলি। আমি ঘেরের স্তর 1 টি কল করব এবং এর স্তর 2 এর অভ্যন্তরে আয়তক্ষেত্র বলব।

একটি গুরুত্বপূর্ণ অন্তর্দৃষ্টি হ'ল কোনও বিন্দু বোমা ফাটা স্তর 1 নেই কারণ আপনি "ব্লাস্ট ব্যাসার্ধ "টি এটির মাধ্যমে পেয়ে যাবেন সর্বদা স্তর 2 থেকে অন্য বর্গাকার বিস্ফোরণের ব্যাসার্ধের মধ্যে থাকে always আপনার নিজেকে সহজেই এ বিষয়ে বোঝাতে সক্ষম হওয়া উচিত।

সুতরাং, আমরা ঘেরটি দূরে সরিয়ে দেওয়ার সর্বোত্তম উপায় অনুসন্ধান করতে সমস্যাটি হ্রাস করতে পারি, তারপরে আমরা সমস্ত বর্গ 0 না হওয়া পর্যন্ত এটি পুনরাবৃত্তি করতে পারি।

তবে অবশ্যই, সর্বোত্তম ফ্যাশনের চেয়ে কম ক্ষেত্রে পেরিমেটারটি বোমা ফেলা সম্ভব হয় তবে এটি সর্বদা সর্বোত্তম সমাধান খুঁজে পাবেন না, তবে এক্স অতিরিক্ত বোমা ব্যবহার করে> এক্স বোমা দ্বারা অভ্যন্তরীণ স্তরটিকে হ্রাস করার সমস্যা তৈরি করে। সুতরাং, আমরা যদি পারমিটার লেয়ারটিকে একটি বলি, আমরা যদি স্তর 2 (কোষের 1 টি ভিতরে) কোথাও একটি এক্স এক্স বোমা রাখি, তবে আমরা কি পরে লেয়ার 2 বোমা ফাটার চেষ্টা এক্স এর চেয়ে বেশি কমাতে পারি? অন্য কথায়, আমাদের প্রমাণ করতে হবে বাইরের পরিধি কমাতে আমরা লোভী হতে পারি।

তবে, আমরা জানি আমরা লোভী হতে পারি। কারণ স্তর ২-তে কোনও বোমা স্তর 3-তে কৌশলগতভাবে রাখা বোমার চেয়ে স্তর 2 থেকে 0 কমাতে আরও দক্ষ হতে পারে না এবং আগের মতো একই কারণে - আমরা সর্বদা 3 স্তরে একটি বোমা রাখতে পারি যা প্রতি বর্গকে প্রভাবিত করে স্তর 2 এর যে বোমাটি স্তর 2 স্থাপন করতে পারে। সুতরাং, এটি লোভী হওয়ার জন্য আমাদের কখনই ক্ষতি করতে পারে না (লোভির এই অর্থে)।

সুতরাং, আমাদের যা করতে হবে তা হল পরবর্তী অভ্যন্তরের স্তরটিকে বোমা মেরে পারমিটারকে 0-তে হ্রাস করার সর্বোত্তম উপায়টি খুঁজে বের করতে।

0 এ প্রথম কোণে বোমা মেরে আমরা কখনই আঘাত পাই না, কারণ কেবলমাত্র কেবলমাত্র ভিতরের স্তরটির কোণটি এটি পৌঁছতে পারে, সুতরাং আমাদের কাছে সত্যই কোনও বিকল্প নেই (এবং, ঘেরের উপরের কোনও বোমাতে বিস্ফোরণের ব্যাসার্ধ রয়েছে অভ্যন্তরীণ স্তর কোণার থেকে বিস্ফোরণ ব্যাসার্ধ)।

একবার আমরা এটি সম্পন্ন করার পরে 0 কোণার সংলগ্ন ঘেরের স্কোয়ারগুলি কেবল অভ্যন্তরীণ স্তর থেকে 2 স্কোয়ারে পৌঁছাতে পারে:

0       A       B

C       X       Y

D       Z

এই মুহুর্তে ঘেরটি কার্যকরভাবে একটি বন্ধ 1 মাত্রিক লুপ, কারণ যে কোনও বোমা 3 সংলগ্ন স্কোয়ার হ্রাস করবে reduce কোণগুলির কাছাকাছি কিছু অদ্ভুততা বাদে - এক্স এ, বি, সি এবং ডি "হিট" করতে পারে

এখন আমরা কোনও বিস্ফোরণ ব্যাসার্ধের কৌশল ব্যবহার করতে পারি না - প্রতিটি বর্গের পরিস্থিতি অলৌকিক কোণগুলি ব্যতীত প্রতিসামন্ডিত, এমনকি কোনও ব্লাস্ট ব্যাসার্ধ অন্যটির উপসেট নয়। মনে রাখবেন যে এটি বন্ধ লুপের পরিবর্তে যদি কোনও লাইন (কর্নেল প্যানিক আলোচিত) হয় তবে সমাধানটি তুচ্ছ। শেষের পয়েন্টগুলি অবশ্যই 0 তে হ্রাস করতে হবে এবং শেষ পয়েন্ট সংলগ্ন পয়েন্টগুলিকে বোমা দেওয়ার জন্য এটি আপনাকে কখনই ক্ষতি করে না কারণ বিস্ফোরণের ব্যাসার্ধ একটি সুপারসেট। একবার আপনি আপনার শেষ পয়েন্ট 0 করার পরে, আপনার এখনও একটি নতুন শেষ পয়েন্ট থাকবে, সুতরাং পুনরাবৃত্তি করুন (লাইনটি সমস্ত 0 না হওয়া পর্যন্ত)।

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


+1 - আমি অনুরূপ কিছু লিখতে যাচ্ছি। আমার মনে হয় আপনি পেয়েছেন!
রেক্স

5
@ বেকার, দয়া করে সমস্যাটি মনোযোগ সহকারে পড়ুন। স্কোয়ারে বোমা ফাটিয়ে তার আটটি প্রতিবেশী হ্রাস পেয়েছে, সুতরাং সেখানে তার অনুমানটি সত্যই সঠিক।
ডার্কস্কি

20
But, we do know we can be greedy...- আমি এটি কিনছি না 1 1 2 1 1 2পরিধি সম্পর্কে বিবেচনা করুন। বোমার সর্বনিম্ন সংখ্যা 4, তবে তিনটি পৃথক সমাধান রয়েছে। প্রতিটি সমাধান পরবর্তী স্তরের উপর আলাদা প্রভাব ফেলে। যতক্ষণ না কোনও পরিধিটির জন্য একাধিক ন্যূনতম সমাধান থাকে, আপনি অভ্যন্তরের স্তরগুলির বিবেচনা না করে পরিধিটি সম্পূর্ণরূপে বিচ্ছিন্ন করতে পারবেন না । ব্যাকট্র্যাকিং না করেই এই সমস্যাটি সমাধান করা সম্ভব বলে আমি আসলেই মনে করি না।
ব্যবহারকারী1354557

4
আমি এই সমাধানটি সম্পর্কে ভাবছিলাম, তবে এটি এত সহজ দেখাচ্ছে না। এটি সত্য, আপনি লেয়ার 1 পরিষ্কার করার জন্য স্তর 2 এ বোমা ফেলতে পারেন, তবে যদি একাধিক সমাধান থাকে তবে তারা উচ্চ স্তরগুলির সমাধানগুলিকে প্রভাবিত করে।
লুকা রাহনে

12
@ পিএসআর: এটি কাজ করে না। বোমা ফেলা পদ্ধতি যা বাইরের স্তরের জন্য সর্বোত্তম, এটি বিশ্বব্যাপী অনুকূল নাও হতে পারে। উদাহরণ: 0011100 0100010 0000000 0000000 1110111। প্রথম স্তরটিকে বোমা দেওয়ার সর্বোত্তম উপায়টি হ'ল দ্বিতীয় সারির মাঝখানে বোমা ফেলা, বাইরের স্তরটিকে হত্যা করতে মোট তিনটি বোমা নেওয়া। তবে তারপরে পরবর্তী স্তরটির যত্ন নিতে আপনার দুটি বোমা লাগবে। সর্বোত্তমটির জন্য মোট চারটি বোমা দরকার: প্রথম দুটি সারির জন্য দুটি এবং শেষ সারির জন্য দুটি।
নিনেনিও

26

পলিয়া বলেছিলেন "যদি আপনি কোনও সমস্যার সমাধান করতে না পারেন, তবে আপনি সমাধান করতে পারেন এমন আরও একটি সহজ সমস্যা রয়েছে: এটি সন্ধান করুন।"

সুস্পষ্ট সরল সমস্যাটি হ'ল 1-মাত্রিক সমস্যা (যখন গ্রিডটি একক সারিতে থাকে)। আসুন সরল অ্যালগরিদম দিয়ে শুরু করা যাক - লোভের সাথে বৃহত্তম টার্গেটকে বোমা দেওয়া। কখন এই ভুল হয়?

প্রদত্ত 1 1 1, লোভী অ্যালগরিদম এটি প্রথমে কোন কোষে বোমা ফেলার বিষয়ে উদাসীন। অবশ্যই, কেন্দ্রের ঘরটি আরও ভাল - এটি একবারে তিনটি কোষকে জিরোস করে। এটি একটি নতুন অ্যালগরিদম এ, "অবশিষ্টের পরিমাণ কমিয়ে আনতে বোমা" প্রস্তাব দেয়। কখন এই অ্যালগরিদম ভুল হয়ে যায়?

প্রদত্ত 1 1 2 1 1, অ্যালগরিদম এ 2 য়, 3 য় বা 4 র্থ কোষগুলিতে বোমা ফেলার মধ্যে উদাসীন। তবে ছেড়ে যাওয়ার 0 0 1 1 1জন্য ২ য় সেলকে বোমা ফাটিয়ে ছেড়ে যাওয়া তৃতীয় কক্ষে বোমা ফেলার চেয়ে ভাল 1 0 1 0 1। কীভাবে ঠিক করব? তৃতীয় কক্ষে বোমা ফেলার সমস্যাটি হ'ল এটি আমাদের বাম দিকে কাজ করে এবং ডানদিকে কাজ করে যা পৃথকভাবে করা উচিত।

কীভাবে "বোতামটি অবশিষ্টাংশের পরিমাণ হ্রাস করতে হবে, তবে সর্বনিম্ন বামে (যেখানে আমরা বোমা মেরেছি) এবং সর্বনিম্নকে ডানদিকে সর্বাধিক করুন" ize এই অ্যালগরিদম বি কল করুন এই এলগরিদমটি কখন ভুল হয়?


সম্পাদনা: মন্তব্যগুলি পড়ার পরে, আমি একমত যে আরও অনেক আকর্ষণীয় সমস্যা হ'ল এক মাত্রিক সমস্যাটি পরিবর্তিত হবে যাতে শেষগুলি যোগ হয়। যে কোনও অগ্রগতি দেখতে চাই।


40
আমি নিশ্চিত নই কেন এই উত্তরটি এতগুলি উপার্জন পাচ্ছে - 1 ডি কেসটি প্রায় তুচ্ছ, কেবল সর্বদা ইতিবাচক উপাদানটির ডানদিকে বোমা দেয়। এটি কাজ করে কারণ বামদিকে কেবল 0 টি রয়েছে এমন কোনও উপাদানকে বোমা দেওয়ার সর্বদা সঠিক উপায় way কোণার স্কোয়ারগুলি অপসারণের জন্য এটি 2 ডি পর্যন্ত বাড়ানো যেতে পারে, তবে এর বাইরেও প্রসারিত করার কোনও সুস্পষ্ট উপায় আমি দেখতে পাচ্ছি না ...?
ব্লুরাজা - ড্যানি প্লেফুঘুফ্ট

3
@ ব্লুরাজ, আমি উজ্জীবিত হয়েছি কারণ এটি স্পষ্টভাবে তুলে ধরেছে যে অন্যান্য উত্তরে আলোচিত লোভী দৃষ্টিভঙ্গি অপর্যাপ্ত ছিল (কমপক্ষে, এটি একটি অতিরিক্ত মানদণ্ডের সাথে পরিপূরক হওয়া প্রয়োজন)। লক্ষ্যের কিছু পছন্দ, এমনকি যদি তারা মোট সংখ্যায় সমান হ্রাস পেতে থাকে তবে জিনিসগুলি অন্যের চেয়ে বেশি ছড়িয়ে যেতে পারে। আমি মনে করি এটি 2D সমস্যার জন্য একটি দরকারী অন্তর্দৃষ্টি।
টিম গুডম্যান

3
এবং সাধারণভাবে "আপনি যদি 2D কেসের সাথে আটকে থাকেন তবে প্রথমে 1D কেস চেষ্টা করে দেখুন" ভাল পরামর্শ।
টিম গুডম্যান

21
@ টিম: "'প্রথমে 1 ডি কেসটি চেষ্টা করে দেখুন' ভাল পরামর্শ" হ্যাঁ এটি এটিই একটি দুর্দান্ত মন্তব্য করে তোলে; তবে এটি কোনও উত্তর নয় ...
ব্লুরাজা - ড্যানি প্লেফুঘিফ্ট

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

12

আমার সময়সীমা ছাড়াই আমাকে কেবল একটি আংশিক সমাধানে থামতে হয়েছিল, তবে আশা করি এই আংশিক সমাধানও এই সমস্যা সমাধানের জন্য একটি সম্ভাব্য পদ্ধতির কিছুটা অন্তর্দৃষ্টি সরবরাহ করে।

যখন কোনও সমস্যার মুখোমুখি হন, আমি সমস্যার জায়গাগুলি সম্পর্কে স্বজ্ঞাততা বিকাশের জন্য সহজ সমস্যা নিয়ে আসতে চাই। এখানে, আমি যে প্রথম পদক্ষেপটি নিয়েছি তা হল এই 2-ডি সমস্যাটিকে 1-ডি সমস্যাতে কমাতে। একটি লাইন বিবেচনা করুন:

0 4 2 1 3 0 1

অন্যভাবে বা অন্য কোনও, আপনি জানেন যে আপনি 4এটি 0 এ নামতে 4 বার বা তার চারপাশে বোমা লাগাতে হবে কারণ যেহেতু স্পটটির বামটি একটি কম সংখ্যা, সুতরাং বোমাটি 0বা 4ওভার বোমা ফেলার কোনও সুবিধা নেই 2। প্রকৃতপক্ষে, আমি বিশ্বাস করি (তবে একটি দৃ proof় প্রমাণের অভাব রয়েছে) যে স্পটটি 0 তে নেমে যাওয়া 2অবধি বোমা ফাটানো 4কমপক্ষে অন্য যে কোনও কৌশল হিসাবে 0 থেকে নীচে নেমে যাওয়ার মতো কম ভাল 4One এটার মত:

index = 1
while index < line_length
  while number_at_index(index - 1) > 0
    bomb(index)
  end
  index++
end
# take care of the end of the line
while number_at_index(index - 1) > 0
  bomb(index - 1)
end

বোমা হামলার কয়েকটি নমুনা:

0 4[2]1 3 0 1
0 3[1]0 3 0 1
0 2[0]0 3 0 1
0 1[0]0 3 0 1
0 0 0 0 3[0]1
0 0 0 0 2[0]0
0 0 0 0 1[0]0
0 0 0 0 0 0 0

4[2]1 3 2 1 5
3[1]0 3 2 1 5
2[0]0 3 2 1 5
1[0]0 3 2 1 5
0 0 0 3[2]1 5
0 0 0 2[1]0 5
0 0 0 1[0]0 5
0 0 0 0 0 0[5]
0 0 0 0 0 0[4]
0 0 0 0 0 0[3]
0 0 0 0 0 0[2]
0 0 0 0 0 0[1]
0 0 0 0 0 0 0

এমন কোনও সংখ্যার সাথে শুরু করার ধারণাটি যা কোনওভাবেই বা অন্য পথে নামতে হবে এটি আবেদনময়ী কারণ এটি হঠাৎ করেই এমন কোনও সমাধান খুঁজে পাওয়া সম্ভব হয় যা কিছু অন্যান্য দাবি যেমন কমপক্ষে কম হিসাবে ভাল বলে দাবি করে ।

জটিলতার পরবর্তী পদক্ষেপ যেখানে কমপক্ষে ভাল হিসাবে এটি সন্ধান করা এখনও সম্ভব তত বোর্ডের প্রান্তে রয়েছে। এটা আমার কাছে পরিষ্কার যে বাইরের প্রান্তে বোমা ফেলার কোনও কঠোর সুবিধা কখনই নেই; আপনি এক জায়গায় স্পট বোমা ফাটানো এবং আরও তিনটি স্পেস নিখরচায় রাখা ভাল। এটি দেওয়া, আমরা বলতে পারি যে প্রান্তের একের ভিতরে রিংটি বোমা ফেলা কমপক্ষে প্রান্তটি বোমা ফেলার মতো ভাল । তদুপরি, আমরা এটিকে অন্তর্দৃষ্টি দিয়ে একত্রিত করতে পারি যে প্রান্তের ডানদিকে একটি বোমা ফেলা আসলে প্রান্তের স্পেসটি নীচে নেমে আসা একমাত্র উপায় 0 এর থেকেও বেশি, সর্বোত্তম কৌশলটি খুঁজে বের করা তুচ্ছভাবে সহজ (এটিতে এটি রয়েছে) অন্য কোন কৌশল হিসাবে কম হিসাবে ভাল) কোণার সংখ্যা নীচে 0 পেতে। আমরা এই সব একত্রে রাখি এবং 2-ডি স্পেসে একটি সমাধানের আরও কাছে যেতে পারি।

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

0 4 2 1 3 0 1 0
4 x x x x x x 4
2 y y y y y y 2
1 y y y y y y 1
3 y y y y y y 3
2 y y y y y y 2
1 y y y y y y 1
5 y y y y y y 5
0 4 2 1 3 0 1 0

উপরের সারিতে কেউ লক্ষ্য করবে যে আমরা আগে দেখেছি এমন রৈখিক উদাহরণের সাথে খুব মিল রয়েছে। আমাদের আগের পর্যবেক্ষণের কথা স্মরণে রেখেছি যে শীর্ষে সারিটি 0 এ নেওয়ার সর্বোত্তম উপায়টি হল দ্বিতীয় সারিতে ( xসারি) বোমা দেওয়া । yসারিগুলির কোনওটি বোমা মেরে উপরের সারিটি পরিষ্কার করার কোনও উপায় নেই এবং সারিটির সংশ্লিষ্ট স্থানটি বোমা মারার উপরে উপরের সারিতে বোমা দেওয়ার কোনও অতিরিক্ত সুবিধা নেই x

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

0 4 2 1 3 0 1 0
4 x[x]x x x x 4
2 y y y y y y 2
1 y y y y y y 1
3 y y y y y y 3
2 y y y y y y 2
1 y y y y y y 1
5 y y y y y y 5
0 4 2 1 3 0 1 0

0 3 1 0 3 0 1 0
4 x[x]x x x x 4
2 y y y y y y 2
1 y y y y y y 1
3 y y y y y y 3
2 y y y y y y 2
1 y y y y y y 1
5 y y y y y y 5
0 4 2 1 3 0 1 0

0 2 0 0 3 0 1 0
4 x[x]x x x x 4
2 y y y y y y 2
1 y y y y y y 1
3 y y y y y y 3
2 y y y y y y 2
1 y y y y y y 1
5 y y y y y y 5
0 4 2 1 3 0 1 0

0 1 0 0 3 0 1 0
4 x[x]x x x x 4
2 y y y y y y 2
1 y y y y y y 1
3 y y y y y y 3
2 y y y y y y 2
1 y y y y y y 1
5 y y y y y y 5
0 4 2 1 3 0 1 0

0 0 0 0 3 0 1 0
4 x x x x x x 4
2 y y y y y y 2
1 y y y y y y 1
3 y y y y y y 3
2 y y y y y y 2
1 y y y y y y 1
5 y y y y y y 5
0 4 2 1 3 0 1 0

এই পদ্ধতির ত্রুটি চূড়ান্ত দুটি বোমা বিস্ফোরণে খুব স্পষ্ট হয়ে ওঠে। এটি পরিষ্কার, প্রদত্ত যে একমাত্র বোমা সাইটগুলি যা 4দ্বিতীয় সারির প্রথম কলামে চিত্রটি হ্রাস করে প্রথম xএবং সেগুলি y। চূড়ান্ত দুটি বোমা বিস্ফোরণ স্পষ্টতই প্রথম বোমা ফেলার চেয়ে নিকৃষ্ট x, যা ঠিক একই কাজটি করত (উপরের সারিতে প্রথম স্থানটি সম্পর্কে, যা আমাদের পরিষ্কার করার কোনও উপায় নেই)। যেহেতু আমরা প্রমাণ করেছি যে আমাদের বর্তমান কৌশলটি সাবঅপটিমাল, তাই কৌশলটিতে একটি সংশোধন প্রয়োজন clearly

এই মুহুর্তে, আমি জটিলতায় একটি পদক্ষেপ পিছনে নিতে পারি এবং কেবল একটি কোণায় ফোকাস করতে পারি। আসুন এটি বিবেচনা করুন:

0 4 2 1
4 x y a
2 z . .
1 b . .

এটা দিয়ে শূণ্যস্থান পেতে একমাত্র উপায় স্পষ্ট 4শূন্য নিচে কিছু সমন্বয় বোমা হয় x, yএবং z। আমার মনের মধ্যে কিছু দড়াবাজি, আমি মোটামুটি আছি নিশ্চিত সন্তোষজনক সমাধান বোমা হয় xতিনবার এবং তারপর aতারপর b। এখন এটি সমাধানে কীভাবে পৌঁছেছিলাম তা নির্ধারণের বিষয় এবং এটি যদি কোনও অন্তর্দৃষ্টি প্রকাশ করে তবে আমরা এমনকি এই স্থানীয় সমস্যা সমাধান করতে ব্যবহার করতে পারি। আমি লক্ষ্য করেছি যে সেখানে কোনও বোমা হামলা yএবং zস্থান নেই। সেই জায়গাগুলিতে বোমা ফাটিয়ে এমন কোণার সন্ধানের চেষ্টা করা এমন কোণ থেকে পাওয়া যায় যা দেখতে এই রকম দেখাচ্ছে:

0 4 2 5 0
4 x y a .
2 z . . .
5 b . . .
0 . . . .

এইটির জন্য, আমার কাছে এটি স্পষ্ট যে সর্বোত্তম সমাধানটি y5 বার এবং z5 বার বোমা দেওয়া । আরও এক ধাপ এগিয়ে চলুন।

0 4 2 5 6 0 0
4 x y a . . .
2 z . . . . .
5 b . . . . .
6 . . . . . .
0 . . . . . .
0 . . . . . .

এখানে, এটি একইভাবে স্বজ্ঞাত মনে করে যে সর্বোত্তম সমাধানটি বোমা aএবং b6 বার এবং তারপরে x4 বার।

এখন এটি কীভাবে সেই অন্তর্দৃষ্টিগুলিকে আমরা যে নীতিমালা তৈরি করতে পারি তাতে কীভাবে পরিবর্তন করা যায় game

আশা করি অবিরত থাকবে!


10

আপডেট হওয়া প্রশ্নের জন্য একটি সাধারণ লোভী অ্যালগরিদম অনুকূল ফলাফল দেয়।

এ [[১,১]] এ সেল [A] [0,0] বোমা ফেলে, তারপরে A [1,0] বোমাটি সেল এ [2,1] এ ফেলে দিন এবং এই প্রক্রিয়াটি নীচের দিকে চালিয়ে যান। নীচে বাম কোণটি পরিষ্কার করতে, সর্বাধিক (A [N-1,0], A [N-2,0], A [N-3,0]) বোমাটি কক্ষ A [N-2,1] এ রেখে দিন। এটি প্রথম 3 টি কলাম সম্পূর্ণরূপে পরিষ্কার করবে।

একই পদ্ধতির সাথে 3,4,5, তারপর কলাম 6,7,8, ইত্যাদি কলামগুলি পরিষ্কার করুন

দুর্ভাগ্যক্রমে এটি মূল সমস্যার সমাধান খুঁজে পেতে সহায়তা করে না।


"বৃহত্তর" সমস্যা ("nonicreasing" সীমাবদ্ধতা ছাড়াই) এনপি-হার্ড হিসাবে প্রমাণিত হতে পারে। এখানে একটি প্রমাণ স্কেচ।

মনে করুন আমাদের কাছে 3 ডিগ্রি পর্যন্ত একটি প্ল্যানার গ্রাফ রয়েছে আসুন এই গ্রাফটির জন্য ন্যূনতম প্রান্তিক কভারটি সন্ধান করুন । উইকিপিডিয়া নিবন্ধ অনুসারে এই সমস্যাটি 3 ডিগ্রি পর্যন্ত প্ল্যানার গ্রাফের জন্য এনপি-হার্ড Plan এটি প্ল্যানার 3 এস্যাট থেকে হ্রাস দ্বারা প্রমাণিত হতে পারে। এবং প্ল্যানার 3 এসএটির কঠোরতা - 3 এসএটি থেকে হ্রাস দ্বারা। এই দুটি প্রমাণই প্রফেসর দ্বারা "অ্যালগোরিদমিক লোয়ার সীমানা" সাম্প্রতিক বক্তৃতায় উপস্থাপন করা হয়েছে । এরিক ডামাইন (বক্তৃতা 7 এবং 9)

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

এখানে চিত্র বর্ণনা লিখুন

যদি আমরা কেবলমাত্র সারি এবং কলামগুলিতে গ্রাফের শীর্ষাংশ স্থাপন করি (এমনভাবে যে কোনও ভার্টেক্সের সাথে দুটি প্রান্তের ঘটনা তীব্র কোণ তৈরি করে না), যেখানেই একটি কিনারা থাকে সেখানে "টি" সন্নিবেশ করান এবং অন্যান্য গ্রিড পজিশনে "জিরো" সন্নিবেশ করান, আমরা ন্যূনতম প্রান্তিকের কভারটি খুঁজে পেতে মূল সমস্যার জন্য কোনও সমাধান ব্যবহার করতে পারি।


বাম দিক থেকে সেই গ্রাফটি কোথা থেকে আসে? দুঃখিত, আমি আপনার ব্যাখ্যাটি বেশ বুঝতে পারছি না!
রায়স্ট

1
@ রাইস্ট: বাম দিক থেকে সেই গ্রাফটি প্ল্যানার গ্রাফের একটি উদাহরণ। এটি 4 ডিগ্রি পর্যন্ত যে কোনও প্ল্যানার গ্রাফটি গ্রিড-সারিবদ্ধ গ্রাফ এবং তারপরে এন * মি ম্যাট্রিক্সে রূপান্তর করতে হয় তা প্রদর্শনের জন্য ব্যবহৃত হয়। এই ম্যাট্রিক্সে প্রয়োগ করা একটি "বোম ড্রপিং" অ্যালগরিদম এই রূপান্তরিত গ্রাফের জন্য এবং তাই "বাম" গ্রাফের জন্য ভার্টেক্স কভার সমস্যা সমাধান করবে।
ইভজেনি ক্লুয়েভ

আহ, আমি এটি এখনই পেয়েছি এবং আমি বিশ্বাস করি যে আপনার রূপান্তরটি সঠিক। ধন্যবাদ!
ryst

@ অ্যাভজেনিক্লুয়েভ, আমি মনে করি এখন আপনাকে প্রমান করতে হবে যে "4 ডিগ্রি পর্যন্ত প্ল্যানার গ্রাফ" এর জন্য প্রান্তিক প্রচ্ছদটি এখনও এনপি-হার্ড।
শাহবাজ

@ শাহবাজ: আমি ভয় করি যে এই প্রমাণটি দীর্ঘ হবে। সুতরাং আমি প্রমাণ লিঙ্ক যোগ।
ইভজেনি ক্লুয়েভ

9

আপনি এই সমস্যাটি পূর্ণসংখ্যা প্রোগ্রামিং সমস্যা হিসাবে প্রতিনিধিত্ব করতে পারেন । (এটি এই সমস্যার কাছে যাওয়ার সম্ভাব্য সমাধানগুলির মধ্যে একটি মাত্র সমাধান)

পয়েন্ট রয়েছে:

a b c d
e f g h
i j k l
m n o p

একটি 16 সমীকরণ লিখতে পারে যেখানে পয়েন্ট f এর উদাহরণস্বরূপ ধারণ করে

f <= ai + bi + ci + ei + fi + gi + ii + ji + ki   

সমস্ত সূচক এবং পূর্ণসংখ্যার সমাধানের যোগফলকে সংক্ষিপ্ত করে।

সমাধান অবশ্যই এই সূচকের সমষ্টি।

সমস্ত সীমানা 0 সীমানায় সেট করে এটি আরও সরল করা যায়, সুতরাং আপনি উদাহরণটিতে 4 + 1 সমীকরণ রেখেছেন।

সমস্যাটি হ'ল এই জাতীয় সমস্যাগুলি সমাধান করার জন্য কোনও তুচ্ছ অ্যালগরিহিটম নেই। আমি এই বিষয়ে বিশেষজ্ঞ নই, তবে লিনিয়ার প্রোগ্রামিং হিসাবে এই সমস্যাটি সমাধান করা এনপি হার্ড।


8
এনপি-তে সমস্ত সমস্যাগুলি পূর্ণসংখ্যা প্রোগ্রামিং সমস্যা হিসাবে তৈরি করা যেতে পারে, সুতরাং এটি খুব কার্যকর নয়, যদি না আমরা ইতিমধ্যে না জানি যে সমস্যাটি এনপি-সম্পূর্ণ
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

1
আমি রাজী. সমাধান কী তা জানার জন্য সঠিক পদক্ষেপগুলি কী তা করতে হবে তাও জানা প্রয়োজন নয়।
লুকা রাহনে

1
আপনি যখন সীমানাটি 0 তে সেট করেন, অসমতার সংখ্যা এখনও 16
ডার্কস্কি

9

এটি একটি আংশিক উত্তর, আমি চেষ্টা করছি এমন একটি নিম্ন বাউন্ড এবং উপরের সীমানা যা বোমার সম্ভাব্য সংখ্যা হতে পারে।

3x3 এবং আরও ছোট বোর্ডে, সমাধানটি সর্বদা সর্বদা বৃহত্তম সংখ্যাযুক্ত ঘর cell

4x4 এর চেয়ে বড় বোর্ডগুলিতে, প্রথম সুস্পষ্ট নিম্নের সীমাটি কোণার সমষ্টি:

*2* 3  7 *1*
 1  5  6  2
 2  1  3  2
*6* 9  6 *4*

তবে আপনি বোমাটি সাজিয়ে রাখেন, 2 + 1 + 6 + 4 = 13 বোমেরও কম এই 4x4 বোর্ডটি সাফ করা অসম্ভব।

অন্যান্য উত্তরে এটি উল্লেখ করা হয়েছে যে কর্নারটি অপসারণের জন্য বোমাটি দ্বিতীয় থেকে কোণে রাখলে বোমাটি কোণে রাখার চেয়ে খারাপ কখনও হয় না, সুতরাং বোর্ডকে দেওয়া হল:

*2* 3  4  7 *1*
 1  5  2  6  2
 4  3  4  2  1
 2  1  2  4  1
 3  1  3  4  1
 2  1  4  3  2
*6* 9  1  6 *4*

নতুন বোর্ড দেওয়ার জন্য আমরা দ্বিতীয়-কোণে বোমা রেখে কোণগুলি জিরো করতে পারি:

 0  1  1  6  0
 0  3  0  5  1
 2  1  1  1  0
 2  1  2  4  1
 0  0  0  0  0
 0  0  0  0  0
 0  3  0  2  0

এ পর্যন্ত সব ঠিকই. কোণগুলি সাফ করার জন্য আমাদের 13 টি বোমা দরকার।

এখন নীচে চিহ্নিত 6, 4, 3 এবং 2 নম্বরটি পর্যবেক্ষণ করুন:

 0  1  1 *6* 0
 0  3  0  5  1
 2  1  1  1  0
*2* 1  2 *4* 1
 0  0  0  0  0
 0  0  0  0  0
 0 *3* 0  2  0

বোমা ফেলার উপায় নেই একটি মাত্র বোমা ব্যবহার করে সেই কোষগুলির কোনও দুটিতে , তাই সর্বনিম্ন বোমাটি 6 + 4 + 3 + 2 দ্বারা বৃদ্ধি পেয়েছে, সুতরাং আমরা কোণগুলি সাফ করার জন্য যে বোমার সংখ্যা ব্যবহার করেছি, আমরা এটি ন্যূনতম পেয়েছি এই মানচিত্রের জন্য প্রয়োজনীয় বোমার সংখ্যা 28 টি বোমাতে পরিণত হয়েছে। ২৮ টিরও কম বোমার সাহায্যে এই মানচিত্রটি সাফ করা অসম্ভব, এই মানচিত্রটির জন্য এটি নিম্ন সীমাবদ্ধ।

উপরের সীমাটি প্রতিষ্ঠার জন্য আপনি লোভী অ্যালগরিদম ব্যবহার করতে পারেন। অন্যান্য উত্তরগুলি দেখায় যে একটি লোভী অ্যালগরিদম এমন একটি সমাধান তৈরি করে যা ২৮ টি বোমা ব্যবহার করে। যেহেতু আমরা আগে প্রমাণ করেছি যে কোনও সর্বোত্তম সমাধানে 28 টিরও কম বোমা থাকতে পারে না, সুতরাং 28 বোমা প্রকৃতপক্ষে একটি সর্বোত্তম সমাধান।

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

নিম্ন সীমাটি সন্ধানের জন্য অ্যালগরিদমটি নিম্নলিখিত:

  1. সর্বাধিক সংখ্যা সহ একটি উপাদান চয়ন করুন, নাম দিন পি।
  2. সমস্ত কক্ষকে P এবং P থেকে দু'দাপ দূরে অচিহ্নযুক্ত হিসাবে চিহ্নিত করুন।
  3. minimumsতালিকায় পি যুক্ত করুন ।
  4. যতক্ষণ না সমস্ত কক্ষ অনিচ্ছুক না হওয়া পর্যন্ত পদক্ষেপ 1 এ পুনরাবৃত্তি করুন।
  5. minimumsনিম্ন সীমা পেতে তালিকা যোগ করুন ।

9

এটি একটি লোভী পদ্ধতির হবে:

  1. অর্ডার এন এক্স মিটারের একটি "স্কোর" ম্যাট্রিক্স গণনা করুন, যেখানে পজিশনে (আই, জে) বোমা ফেলা হলে ম্যাট্রিক্সের পয়েন্টগুলির মোট কর্তন হ'ল স্কোর [i] [জে]। (পয়েন্টের সর্বোচ্চ স্কোর 9 এবং মিনিটের স্কোর 0)

  2. সারি অনুসারে চলুন, সর্বাধিক স্কোর সহ প্রথম অবস্থানটি সন্ধান করুন (বলুন (i, j))।

  3. বোমা (আই, জে) বোমা গণনা বৃদ্ধি করুন।

  4. মূল ম্যাট্রিক্সের সমস্ত উপাদান যদি শূন্য না হয়, তবে গোটো 1 1

আমার সন্দেহ আছে যে এটি সর্বোত্তম সমাধান যদিও।

সম্পাদনা:

আমি উপরে যে লোভী দৃষ্টিভঙ্গি পোস্ট করেছি এটি কাজ করার সময় সম্ভবত আমাদের সর্বোত্তম সমাধান দেয় না। সুতরাং আমি ভেবেছিলাম এটিতে ডিপির কিছু উপাদান যুক্ত করা উচিত।

আমি মনে করি যে আমরা যে কোনও সময়ে সর্বাধিক "স্কোর" (স্কোর [i] [জে] = পয়েন্টের মোট কর্তন যদি (আই, জে) বোমা ফেলা হয়) থাকে তবে অবশ্যই তাকে লক্ষ্য রাখতে হবে আমরা একমত হতে পারি। এই অনুমান দিয়ে শুরু, এখানে নতুন পদ্ধতির:

নুমঅফবম্বস (এম): (বোমা বিস্ফোরণের সর্বনিম্ন সংখ্যা ফেরৎ দেয়)

  1. অর্ডার একটি ম্যাট্রিক্স এম দেওয়া হয়েছে এক্স এক্স মি। যদি এম এর সমস্ত উপাদান শূন্য হয়, তবে 0 এ ফিরে আসুন।

  2. "স্কোর" ম্যাট্রিক্স এম গণনা করুন

    পি পৃথক অবস্থানগুলি পি 1, পি 2, ... পিকে (1 <= কে <= এন * মি), সর্বোচ্চ স্কোর সহ এম এর মধ্যে অবস্থান করুন।

  3. রিটার্ন (1 + মিনিট (NumOfBombs (M1), NumOfBombs (M2), ..., NumOfBombs (এমকে)))

    যেখানে আমরা যথাক্রমে P1, P2, ..., Pk পজিশনে বোমা দিলে এম 1, এম 2, ..., এম কে ফলাফল ম্যাট্রিক হয়।

এছাড়াও, আমরা যদি এইগুলি ছাড়াও পজিশনের ক্রমটি নূকিত করতে চাই তবে আমাদের "মিনিট" এর ফলাফলগুলি ট্র্যাক করে রাখতে হবে।


3
আমি ভাবছি যদি বর্তমান মানগুলির যোগফল হিসাবে স্কোর নির্ধারণ করা আরও ভাল ফলাফল দেয়। এটি মূলত আরও দক্ষতার সাথে জমিনকে সমতল করবে।
ইউজিন

@ ইউজিন: অত্যন্ত আকর্ষণীয় বিষয়। আপনার পথে কেন আরও ভাল ফলাফল করা উচিত নয় তা আমি কোনও কারণেই ভাবতে পারি না ...
সিডআর

@ ইউজিন: সম্ভবত আশেপাশের বর্তমান মানগুলির যোগফলটিকে "অগ্রাধিকার" পরিমাপের জন্য ব্যবহার করা যেতে পারে? সর্বোচ্চ স্কোর এবং সর্বোচ্চ অগ্রাধিকার সহ নোডকে
নিউক করুন

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

1
@ ইউজিন, সম্ভবত আমি আপনাকে অনুসরণ করছি না সবচেয়ে বড় হ্রাস এবং সমস্ত অবশিষ্ট মানের সবচেয়ে ছোট যোগফলের মধ্যে পার্থক্য কী? বাকী মানগুলির যোগফল (বোমা ফেলার পরে) কেবলমাত্র বর্তমান মোট মান ব্যতীত সেই স্থানটিতে বোমা ফাটা থেকে হ্রাস হ্রাস, তাই কি এই সমতুল্য নয়?
টিম গুডম্যান

8

আপনার নতুন সমস্যাটি, সারিগুলিতে অবিরাম মানগুলির সাথে সমাধান করা বেশ সহজ।

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

এখন, একবার বাম কলামটি শূন্য হয়ে গেলে, আমরা কেবলমাত্র বামে তিনটি কলামগুলি এখন ছাঁটাই করে ফেলেছি এবং এখন-হ্রাসিত ম্যাট্রিক্সের সাথে পুনরাবৃত্তি করছি। এটি অবশ্যই আমাদের সর্বোত্তম সমাধান দেবে যেহেতু প্রতিটি পর্যায়ে আমরা কমপক্ষে বোমা ব্যবহারের সম্ভাব্য সংখ্যা ব্যবহার করি।


আমি এটা পাই. আমি একই ধারণা চিন্তা। : এস পরের বার আরও মনোযোগ সহকারে পড়ব। তবে ধন্যবাদ যে অনেকের 'সমাধান করতে সমস্যা আছে' nice
abc

4

গাণিতিক পূর্ণসংখ্যা লিনিয়ার প্রোগ্রামিং শাখা-এবং-সীমা ব্যবহার করে

যেমনটি ইতিমধ্যে উল্লেখ করা হয়েছে, পূর্ণসংখ্যা লিনিয়ার প্রোগ্রামিং (যা এনপি-হার্ড ) ব্যবহার করে এই সমস্যাটি সমাধান করা যেতে পারে । ম্যাথামেটিকাল ইতিমধ্যে ILP সালে নির্মিত হয়েছে। "To solve an integer linear programming problem Mathematica first solves the equational constraints, reducing the problem to one containing inequality constraints only. Then it uses lattice reduction techniques to put the inequality system in a simpler form. Finally, it solves the simplified optimization problem using a branch-and-bound method."[দেখুন সীমাবদ্ধ অপ্টিমাইজেশান ম্যাথামেটিকাল মধ্যে টিউটোরিয়াল ..]

আমি নিম্নলিখিত কোডটি লিখেছি যা গণিতের আইএলপি লাইব্রেরি ব্যবহার করে। এটি আশ্চর্যজনকভাবে দ্রুত।

solveMatrixBombProblem[problem_, r_, c_] := 
 Module[{}, 
  bombEffect[x_, y_, m_, n_] := 
   Table[If[(i == x || i == x - 1 || i == x + 1) && (j == y || 
        j == y - 1 || j == y + 1), 1, 0], {i, 1, m}, {j, 1, n}];
  bombMatrix[m_, n_] := 
   Transpose[
    Table[Table[
      Part[bombEffect[(i - Mod[i, n])/n + 1, Mod[i, n] + 1, m, 
        n], (j - Mod[j, n])/n + 1, Mod[j, n] + 1], {j, 0, 
       m*n - 1}], {i, 0, m*n - 1}]];
  X := x /@ Range[c*r];
  sol = Minimize[{Total[X], 
     And @@ Thread[bombMatrix[r, c].X >= problem] && 
      And @@ Thread[X >= 0] && Total[X] <= 10^100 && 
      Element[X, Integers]}, X];
  Print["Minimum required bombs = ", sol[[1]]];
  Print["A possible solution = ", 
   MatrixForm[
    Table[x[c*i + j + 1] /. sol[[2]], {i, 0, r - 1}, {j, 0, 
      c - 1}]]];]

সমস্যাটিতে প্রদত্ত উদাহরণের জন্য:

solveMatrixBombProblem[{2, 3, 4, 7, 1, 1, 5, 2, 6, 2, 4, 3, 4, 2, 1, 2, 1, 2, 4, 1, 3, 1, 3, 4, 1, 2, 1, 4, 3, 2, 6, 9, 1, 6, 4}, 7, 5]

আউটপুট

এখানে চিত্র বর্ণনা লিখুন

লোভী অ্যালগরিদম সহ যে কেউ এটি পড়ছেন For

নিম্নলিখিত 10x10 সমস্যাটিতে আপনার কোড ব্যবহার করে দেখুন:

5   20  7   1   9   8   19  16  11  3  
17  8   15  17  12  4   5   16  8   18  
4   19  12  11  9   7   4   15  14  6  
17  20  4   9   19  8   17  2   10  8  
3   9   10  13  8   9   12  12  6   18  
16  16  2   10  7   12  17  11  4   15  
11  1   15  1   5   11  3   12  8   3  
7   11  16  19  17  11  20  2   5   19  
5   18  2   17  7   14  19  11  1   6  
13  20  8   4   15  10  19  5   11  12

এখানে এটি কমা-বিচ্ছিন্ন:

5, 20, 7, 1, 9, 8, 19, 16, 11, 3, 17, 8, 15, 17, 12, 4, 5, 16, 8, 18, 4, 19, 12, 11, 9, 7, 4, 15, 14, 6, 17, 20, 4, 9, 19, 8, 17, 2, 10, 8, 3, 9, 10, 13, 8, 9, 12, 12, 6, 18, 16, 16, 2, 10, 7, 12, 17, 11, 4, 15, 11, 1, 15, 1, 5, 11, 3, 12, 8, 3, 7, 11, 16, 19, 17, 11, 20, 2, 5, 19, 5, 18, 2, 17, 7, 14, 19, 11, 1, 6, 13, 20, 8, 4, 15, 10, 19, 5, 11, 12

এই সমস্যার জন্য, আমার সমাধানটিতে 208 টি বোমা রয়েছে । এখানে একটি সম্ভাব্য সমাধান রয়েছে (আমি এটি প্রায় 12 সেকেন্ডের মধ্যে সমাধান করতে সক্ষম হয়েছি)।

এখানে চিত্র বর্ণনা লিখুন

ম্যাথমেটিকাগুলি যে ফলাফলগুলি তৈরি করছে তা পরীক্ষার উপায় হিসাবে আপনার লোভী অ্যালগরিদম আরও ভাল কিছু করতে পারে কিনা তা দেখুন।


আমি এই উত্তরটি দিয়ে 219 এ সক্ষম হয়েছি: স্ট্যাকওভারফ্লো
অ্যান্টনি কুইন

3

লিনিয়ার সাব-সমস্যাগুলিতে সমস্যাটি রূপান্তর করার দরকার নেই।

পরিবর্তে একটি সাধারণ লোভী হিউরিস্টিক ব্যবহার করুন, এটি সবচেয়ে বড়টি দিয়ে শুরু করে কোণগুলিকে বোমা দেওয়ার জন্য

প্রদত্ত উদাহরণে চারটি কোণ রয়েছে, {2, 1, 6, 4}। প্রতিটি কোণার জন্য ঘরের কোণটি কোণে বোমা দেওয়ার চেয়ে ভাল কোনও পদক্ষেপ নেই, সুতরাং আমরা জানি যে আমাদের প্রথম 2 + 1 + 6 + 4 = 13 বোমাটি অবশ্যই এই ত্রিভুজ কোষগুলিতে হওয়া উচিত। বোমা ফেলার পরে আমরা একটি নতুন ম্যাট্রিক্স রেখেছি:

2 3 4 7 1      0 1 1 6 0      0 1 1 6 0     1 1 6 0     0 0 5     0 0 0 
1 5 2 6 2      0 3 0 5 1      0 3 0 5 1  => 1 0 4 0  => 0 0 3  => 0 0 0  
4 3 4 2 1      2 1 1 1 0      2 1 1 1 0     0 0 0 0     0 0 0     0 0 3  
2 1 2 4 1  =>  2 1 2 4 1  =>  2 1 2 4 1     0 0 3 0     0 0 3      
3 1 3 4 1      0 0 0 0 0      0 0 0 0 0 
2 1 4 3 2      0 0 0 0 0      0 0 0 0 0 
6 9 1 6 4      0 3 0 2 0      0 0 0 0 0 

প্রথম 13 বোমা বিস্ফোরণের পরে আমরা 3 বোমা বিস্ফোরণের মাধ্যমে 3 0 2 কে নির্মূল করার জন্য হিউরিস্টিক ব্যবহার করি। এখন, আমাদের কাছে চতুর্থ সারিতে 2 টি নতুন কোণ, {2, 1। রয়েছে। আমরা তাদের বোমা, আরও 3 বোমা হামলা। আমরা এখন ম্যাট্রিক্স 4 x 4 এ কমিয়েছি। উপরের বামদিকে এক কোণা রয়েছে। আমরা এটা বোমা। এখন আমাদের 2 টি কোণ রয়েছে, {5, 3}} যেহেতু 5 হ'ল বৃহত্তম কোণে আমরা প্রথমে বোমাবর্ষণ করি, 5 টি বোমাবর্ষণ করা হবে, তারপরে অবশেষে 3 টিটিকে অন্য কোণায় বোমা দিন। মোট 13 + 3 + 3 + 1 + 5 + 3 = 28।


1
বোমার কোণে বোমা দেওয়ার পরে আপনি সাধারণ ক্ষেত্রে কী করেন তা আমি বুঝতে পারি না
রিয়াড

কোণ থেকে বোমা ফাটানো কোণার থেকে ভিতরের দিকে তির্যকভাবে বোমা ফেলার চেয়ে কার্যকর কখনও হয় না।
PSr

1
পিএসআর আপনি আমার পোস্টটি ভুল বুঝেছেন, আমি কোণ থেকে তির্যকভাবে বোমা ফাছি, পোস্টটি আবার পড়ি
টাইলার ডারডন

11
@ টাইলারডুরডেন: ম্যাট্রিক্স ছোট হওয়ায় এটি কেবল কাজ করে। বড় ম্যাট্রিকগুলিতে, কোণে বোমা দেওয়ার পরে, আপনি সাধারণত আর প্রান্তগুলি কাটাতে সক্ষম হবেন না।
মিথ্যা রায়ান

3

এটি অবস্থানের এই "ধাঁধা" এর মধ্য দিয়ে সবচেয়ে সংক্ষিপ্ততম পথ (বোমা বিস্ফোরণের ধারাবাহিক) জন্য প্রস্থের অনুসন্ধান করে। না, আমি প্রমাণ করতে পারি না যে এর চেয়ে দ্রুত অ্যালগোরিদম নেই, দুঃখিত।

#!/usr/bin/env python

M = ((1,2,3,4),
     (2,3,4,5),
     (5,2,7,4),
     (2,3,5,8))

def eachPossibleMove(m):
  for y in range(1, len(m)-1):
    for x in range(1, len(m[0])-1):
      if (0 == m[y-1][x-1] == m[y-1][x] == m[y-1][x+1] ==
               m[y][x-1]   == m[y][x]   == m[y][x+1] ==
               m[y+1][x-1] == m[y+1][x] == m[y+1][x+1]):
        continue
      yield x, y

def bomb(m, (mx, my)):
  return tuple(tuple(max(0, m[y][x]-1)
      if mx-1 <= x <= mx+1 and my-1 <= y <= my+1
      else m[y][x]
      for x in range(len(m[y])))
    for y in range(len(m)))

def findFirstSolution(m, path=[]):
#  print path
#  print m
  if sum(map(sum, m)) == 0:  # empty?
    return path
  for move in eachPossibleMove(m):
    return findFirstSolution(bomb(m, move), path + [ move ])

def findShortestSolution(m):
  black = {}
  nextWhite = { m: [] }
  while nextWhite:
    white = nextWhite
    nextWhite = {}
    for position, path in white.iteritems():
      for move in eachPossibleMove(position):
        nextPosition = bomb(position, move)
        nextPath = path + [ move ]
        if sum(map(sum, nextPosition)) == 0:  # empty?
          return nextPath
        if nextPosition in black or nextPosition in white:
          continue  # ignore, found that one before
        nextWhite[nextPosition] = nextPath

def main(argv):
  if argv[1] == 'first':
    print findFirstSolution(M)
  elif argv[1] == 'shortest':
    print findShortestSolution(M)
  else:
    raise NotImplementedError(argv[1])

if __name__ == '__main__':
  import sys
  sys.exit(main(sys.argv))

1
এই অ্যালগরিদম হবে প্যাচসমূহ fewest নম্বর খুঁজে, কিন্তু এটি একটি খুব দীর্ঘ সময় নিতে পারে। আপনি কি প্রদত্ত ডেটা সেটটিতে এটি চালিয়েছেন? এটি অন্য অ্যালগরিদমের সাথে তুলনা করার জন্য একটি বেসলাইন দেবে।
রায়ান আমোস

1
প্রদত্ত ম্যাট্রিক্সের 5x4 এর একটি উপসেট প্রায় 2 সেকেন্ডে সমাধান করা হয়েছিল, 5x5 ইতিমধ্যে 2 মিনিটের বেশি সময় নিয়েছে। আমি এখনও আরও চেষ্টা করিনি ;-) হ্যাঁ, এই অ্যালগরিদম মূল কাজটি ছাড়া আর কোনও কিছুর জন্য অনুকূলিত করা হয়নি: সংক্ষিপ্ততম সমাধানটি সন্ধান করুন।
আলফে

2
তাত্পর্যপূর্ণ জটিলতার সৌন্দর্য এটি।
রায়ান আমোস

3

মনে হচ্ছে এখানে একটি রৈখিক প্রোগ্রামিং পদ্ধতি খুব সহায়ক হতে পারে।

যাক পি এম XN পজিশনের মান ম্যাট্রিক্স হতে:

পজিশনের ম্যাট্রিক্স

এখন নীচে হিসাবে 1 ≤ x ≤ m , 1 ≤ y ≤ n সহ একটি বোমার ম্যাট্রিক্স বি (x, y) mxn সংজ্ঞায়িত করা যাক

বোম্ব ম্যাট্রিক্স

এইভাবে যে

বোম ম্যাট্রিক্সে অবস্থানের মান

উদাহরণ স্বরূপ:

বি (3, 3)

সুতরাং আমরা একটি ম্যাট্রিক্স বি এম এক্সএন = [ বি আইজে ] এর দিকে চেয়েছি

  1. বোমা ম্যাট্রিক্সের যোগফল হিসাবে সংজ্ঞায়িত করা যায়:

    বো ম্যাট্রিকের যোগফল হিসাবে বি

    ( IJ হবে তারপর বোমার পরিমাণ আমরা অবস্থানে ড্রপ করবে পি IJ )

  2. p ij - b ij ≤ 0 (আরও সংক্ষিপ্ত হতে, আসুন আমরা এটি পি - বি ≤ 0 হিসাবে বলি )

এছাড়াও, এর যোগফল কম করা উচিত বোমা পরিমাণের পরিমাণ

আমরা এগিয়ে কুরুচিপূর্ণ ম্যাট্রিক্স হিসাবে বি লিখতে পারেন :

পরিমাণের যোগফলের ম্যাট্রিক্স হিসাবে বি

এবং যেহেতু পি - বি ≤ 0 (যার অর্থ পি ≤ বি ) আমাদের নীচে নীচে সুন্দর রৈখিক বৈষম্য ব্যবস্থা রয়েছে:

বোমা নামার সংখ্যা এবং অবস্থানগুলিতে মানগুলির মধ্যে সম্পর্ক

হচ্ছে কুই MN এক্স 1 হিসাবে সংজ্ঞায়িত করা

পরিমাণের ভেক্টর

পি এমএন এক্স 1 হিসাবে সংজ্ঞায়িত

P এর মান ভেক্টর হিসাবে বিতরণ করা হয়েছে

আমরা বলতে পারি যে আমরা একটি সিস্টেম আছে সিস্টেমের ম্যাট্রিক্স http://latex.codecogs.com/gif.download?S%5Cmathbf%7Bq%7D&space;%5Cge&space;%5Cmathbf%7Bp%7D পণ্য হিসাবে প্রতিনিধিত্ব নিচে হচ্ছে এস MN এক্স MN ম্যাট্রিক্স সিস্টেম সমাধানের জন্য বিপরীত হতে পারে। আমি নিজে এটি প্রসারিত করি নি তবে আমি বিশ্বাস করি কোডে এটি করা সহজ হওয়া উচিত।

এখন, আমাদের একটি ন্যূনতম সমস্যা রয়েছে যা হিসাবে উল্লেখ করা যেতে পারে

আমাদের সমাধান করতে হবে সিস্টেম

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

( ল্যাটেক্স এক্সপ্রেশন থেকে ছবি তৈরি করতে এই আশ্চর্যজনক সাইটের জন্য বিশেষ ধন্যবাদ )


আপনি কি নিশ্চিত যে আপনার বৈষম্যগুলি বিপরীত নয়? তা কি বর্গ> = পি? অর্থাৎ, বর্গক্ষেত্রের বোমা পড়ার মোট সংখ্যা প্রদত্ত ম্যাট্রিক্সের চেয়ে বড় বা সমান
darksky

1
যখন লিনিয়ার প্রোগ্রামের ভেরিয়েবলগুলি পূর্ণসংখ্যার মধ্যে সীমাবদ্ধ থাকে, তখন আমরা সেইটিকে "পূর্ণসংখ্যার লিনিয়ার প্রোগ্রামিং" (আইপি) বলি । অবিচ্ছিন্ন ক্ষেত্রে থেকে পৃথক, আইপি এনপি-সম্পূর্ণ। দুর্ভাগ্যক্রমে, সিমপ্লেক্স অ্যালগরিদম কোনও সাহায্য করে না, যদি না কোনও আনুমানিক গ্রহণযোগ্য হয়। এবং আইপি ইতিমধ্যে অন্য উত্তর উল্লেখ করা হয়েছে
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

@ ব্লুরাজা-ড্যানিপ্লুঘুফুট সঠিক। "Despite the many crucial applications of this problem, and intense interest by researchers, no efficient algorithm is known for it.পৃষ্ঠা 254 দেখুন Inte পূর্ণসংখ্যার লিনিয়ার প্রোগ্রামিং একটি খুব হার্ড গণনীয় সমস্যা। আমাদের একমাত্র দক্ষ হতে আশা করি আপনার ম্যাট্রিক্স সম্পর্কে স্বকীয় বৈশিষ্ট্য শোষণ এস তাই না যে সব পরে নির্বিচারে।
darksky

3

এই লোভী সমাধানটি সঠিক বলে মনে হচ্ছে :

মতামত হিসাবে ইঙ্গিত হিসাবে, এটি 2 ডি ব্যর্থ হবে। তবে আপনি এটি উন্নতি করতে পারে।

1 ডি এর জন্য:
যদি কমপক্ষে 2 নম্বর থাকে তবে আপনার বামতম একটিতে গুলি করার দরকার নেই কারণ দ্বিতীয়টিতে শ্যুটিং করা খারাপ নয় । সুতরাং দ্বিতীয়টিতে অঙ্কুর করুন, যখন প্রথম 0 নয়, কারণ আপনাকে এটি করতে হবে। পরবর্তী কক্ষে সরান। শেষ কক্ষ সম্পর্কে ভুলবেন না।

সি ++ কোড:

void bombs(vector<int>& v, int i, int n){
    ans += n;
    v[i] -= n;
    if(i > 0)
        v[i - 1] -= n;
    if(i + 1< v.size())
        v[i + 1] -= n;
}

void solve(vector<int> v){
    int n = v.size();
    for(int i = 0; i < n;++i){
        if(i != n - 1){
            bombs(v, i + 1, v[i]);
        }
        else
            bombs(v, i, v[i])
    }
}

সুতরাং 2 ডি এর জন্য:
আবার: আপনার প্রথম সারিতে শ্যুট করার দরকার নেই (যদি দ্বিতীয়টি থাকে)। সুতরাং দ্বিতীয় এক অঙ্কুর। প্রথম সারির জন্য 1D টাস্কটি সমাধান করুন। (কারণ আপনার এটি নাল করা প্রয়োজন)। নামা. শেষ সারি ভুলবেন না।


5
একজন counterexample: "0110","1110","1110"। আপনার কেবলমাত্র 1 টি শট দরকার, তবে আমি বিশ্বাস করি আপনার অ্যালগোরিদমটি 2 ব্যবহার করবে
মানিক

2

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

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


এটি অনুকূল নয়। পাল্টা-উদাহরণ: 1010101, 0010100(শীর্ষ সারি, নিচের সারি) আপনার পদ্ধতির 3. প্রয়োজন হবে এটা 2. কাজ করা যেতে পারে
Mysticial

2

আমি বিশ্বাস করি যে বোমার পরিমাণ কমিয়ে আনার জন্য আপনার কেবল ক্ষতির পরিমাণ সর্বাধিক প্রয়োজন ... এর জন্য সবচেয়ে শক্তিশালী বলের ক্ষেত্রটি পরীক্ষা করা প্রয়োজন .. সুতরাং আপনি প্রথমে একটি 3x3 কার্নেল দিয়ে ক্ষেত্রটি বিশ্লেষণ করুন এবং কোথায় যোগফলটি পরীক্ষা করবেন শক্তিশালী .. এবং সেখানে বোমা .. এবং ক্ষেত্র সমতল না হওয়া পর্যন্ত করুন .. এই দায়ের করার জন্য উত্তরটি 28 টি is

var oMatrix = [
[2,3,4,7,1],
[1,5,2,6,2],
[4,3,4,2,1],
[2,1,2,4,1],
[3,1,3,4,1],
[2,1,4,3,2],
[6,9,1,6,4]
]

var nBombs = 0;
do
{
    var bSpacesLeftToBomb = false;
    var nHigh = 0;
    var nCellX = 0;
    var nCellY = 0;
    for(var y = 1 ; y<oMatrix.length-1;y++) 
        for(var x = 1 ; x<oMatrix[y].length-1;x++)  
        {
            var nValue = 0;
            for(var yy = y-1;yy<=y+1;yy++)
                for(var xx = x-1;xx<=x+1;xx++)
                    nValue += oMatrix[yy][xx];

            if(nValue>nHigh)
            {
                nHigh = nValue;
                nCellX = x;
                nCellY = y; 
            }

        }
    if(nHigh>0)
    {
        nBombs++;

        for(var yy = nCellY-1;yy<=nCellY+1;yy++)
        {
            for(var xx = nCellX-1;xx<=nCellX+1;xx++)
            {
                if(oMatrix[yy][xx]<=0)
                    continue;
                oMatrix[yy][xx] = --oMatrix[yy][xx];
            }
        }
        bSpacesLeftToBomb = true;
    }
}
while(bSpacesLeftToBomb);

alert(nBombs+'bombs');

এটি অন্যান্য উত্তরগুলির কয়েকটি হিসাবে একই অ্যালগরিদম তবে অনেক পরে।
PSr

@psr শুধু তাই নয় এটি অনুকূল নয়।
রহস্যময়

আমি এটি পোস্ট করেছি, কারণ, যখন এই অ্যালগরিদম প্রস্তাবিত হয়েছিল, আমি কোডের কোনও পোষ্ট বা "ধারণার প্রোফেসর" পাইনি। সুতরাং আমি ভেবেছিলাম এটি বিভ্রান্তিতে সহায়তা করতে পারে .. তবে .. বিটিডব্লিউ @ মিস্টিকাল আপনার কী এমন অধ্যাপক আছে যে আরও অনুকূল উপায় আছে?
CaldasGSM

@ ক্যালডাসজিএসএম কোনও উদ্বেগ নয়, আসল সমস্যাটি (সিকোয়েন্সিং ছাড়াই) কঠিন hard এখনও পর্যন্ত একটি মাত্র উত্তর রয়েছে যা এটি সর্বোত্তমভাবে সমাধান করে, তবে এটি তাত্পর্যপূর্ণ সময়ে চলে।
রহস্যময়

2

এখানে এমন একটি সমাধান রয়েছে যা কোণগুলির ভাল বৈশিষ্ট্যগুলিকে সাধারণীকরণ করে।

আসুন ধরে নেওয়া যাক আমরা একটি প্রদত্ত ক্ষেত্রের জন্য একটি নিখুঁত ড্রপ পয়েন্ট খুঁজে পেতে পারি, এটি, এর মান হ্রাস করার সর্বোত্তম উপায়। তারপরে ন্যূনতম বোমা ফেলতে হবে তা জানতে, একটি অ্যালগরিদমের প্রথম খসড়াটি হতে পারে (কোডটি রুবি বাস্তবায়নের মাধ্যমে অনুলিপিটি সংযুক্ত করা হয়):

dropped_bomb_count = 0
while there_are_cells_with_non_zero_count_left
  coordinates = choose_a_perfect_drop_point
  drop_bomb(coordinates)
  dropped_bomb_count += 1
end
return dropped_bomb_count

চ্যালেঞ্জ হ'ল choose_a_perfect_drop_point। প্রথমে একটি নিখুঁত ড্রপ পয়েন্ট কী তা নির্ধারণ করি।

  • মান হ্রাস করার জন্য একটি ড্রপ পয়েন্ট । এটি অন্যান্য কোষের মানগুলিও হ্রাস করতে পারে।(x, y)(x, y)
  • একটি ড্রপ বিন্দু একটি জন্য (x, y)হয় ভাল একটি ড্রপ বিন্দু চেয়ে জন্য (x, y)যদি এটা কোষের একটি সঠিক সুপারসেটও যে মান কমে যায় হ্রাস পায়।
  • অন্য কোনও ড্রপ পয়েন্ট না থাকলে একটি ড্রপ পয়েন্ট সর্বাধিক
  • জন্য দুটি ড্রপ পয়েন্ট (x, y)হয় সমতুল্য যদি তারা কোষের একই সেট হ্রাস।
  • জন্য একটি ড্রপ বিন্দু (x, y)হয় নিখুঁত যদি এটা জন্য সব সর্বাধিক ড্রপ পয়েন্ট সমতূল্য (x, y)

যদি এর জন্য একটি নিখুঁত ড্রপ পয়েন্ট থাকে তবে এর জন্য নিখুঁত ড্রপ পয়েন্টগুলির মধ্যে একটিতে বোমা ফেলার চেয়ে আপনি কার্যকরভাবে (x, y)মূল্য হ্রাস করতে পারবেন না ।(x, y)(x, y)

প্রদত্ত ক্ষেত্রের জন্য একটি নিখুঁত ড্রপ পয়েন্ট হল এর যে কোনও একটির জন্য নিখুঁত ড্রপ পয়েন্ট।

এখানে কয়েকটি উদাহরণ দেওয়া হল:

1 0 1 0 0
0 0 0 0 0
1 0 0 0 0
0 0 0 0 0
0 0 0 0 0

ঘরের জন্য নিখুঁত ড্রপ পয়েন্ট (0, 0)(শূন্য-ভিত্তিক সূচক) (1, 1)। এর জন্য সকল অন্যান্য ড্রপ পয়েন্ট (1, 1), যে হয় (0, 0), (0, 1)এবং (1, 0)কম কোষ হ্রাস।

0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0

সেল জন্য একটি নিখুঁত ড্রপ বিন্দু (2, 2)(শূন্য ভিত্তিক সূচক) হল (2, 2), এবং এছাড়াও সব পার্শ্ববর্তী কোষ (1, 1), (1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2), এবং (3, 3)

0 0 0 0 1
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0

সেল জন্য একটি নিখুঁত ড্রপ পয়েন্ট (2, 2)হয় (3, 1): এটা মান কমে যায় (2, 2), এবং মান (4, 0)। এর জন্য অন্য সমস্ত ড্রপ পয়েন্টগুলি (2, 2)সর্বাধিক নয়, কারণ এগুলি একটি ঘরের কম হয়। এর জন্য নিখুঁত ড্রপ পয়েন্টও এর জন্য (2, 2)উপযুক্ত ড্রপ পয়েন্ট (4, 0)এবং এটি ক্ষেত্রের জন্য একমাত্র নিখুঁত ড্রপ পয়েন্ট। এটি এই ক্ষেত্রটির (এক বোমা ড্রপ) নিখুঁত সমাধানের দিকে নিয়ে যায়।

1 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
1 0 0 0 0

এর জন্য কোনও নিখুঁত ড্রপ পয়েন্ট নেই (2, 2): উভয়ই হ্রাস (1, 1)এবং (1, 3)হ্রাস (2, 2)এবং অন্য একটি ঘর (এগুলির জন্য সর্বাধিক ড্রপ পয়েন্ট (2, 2)) তবে তারা সমতুল্য নয়। তবে (1, 1)এটির জন্য একটি নিখুঁত ড্রপ পয়েন্ট (0, 0)এবং (1, 3)এটি একটি নিখুঁত ড্রপ পয়েন্ট (0, 4)

নিখুঁত ড্রপ পয়েন্টের সংজ্ঞা এবং চেকগুলির একটি নির্দিষ্ট ক্রম সহ, আমি প্রশ্নের উদাহরণের জন্য নিম্নলিখিত ফলাফলটি পেয়েছি:

Drop bomb on 1, 1
Drop bomb on 1, 1
Drop bomb on 1, 5
Drop bomb on 1, 5
Drop bomb on 1, 5
Drop bomb on 1, 6
Drop bomb on 1, 2
Drop bomb on 1, 2
Drop bomb on 0, 6
Drop bomb on 0, 6
Drop bomb on 2, 1
Drop bomb on 2, 5
Drop bomb on 2, 5
Drop bomb on 2, 5
Drop bomb on 3, 1
Drop bomb on 3, 0
Drop bomb on 3, 0
Drop bomb on 3, 0
Drop bomb on 3, 0
Drop bomb on 3, 0
Drop bomb on 3, 4
Drop bomb on 3, 4
Drop bomb on 3, 3
Drop bomb on 3, 3
Drop bomb on 3, 6
Drop bomb on 3, 6
Drop bomb on 3, 6
Drop bomb on 4, 6
28

তবে, প্রতিটি পদক্ষেপের পরে কমপক্ষে একটি নিখুঁত ড্রপ পয়েন্ট থাকলে অ্যালগরিদম কেবলমাত্র কাজ করে। যেখানে নিখুঁত ড্রপ পয়েন্ট নেই সেখানে উদাহরণ তৈরি করা সম্ভব:

0 1 1 0
1 0 0 1
1 0 0 1
0 1 1 0

এই ক্ষেত্রেগুলির জন্য, আমরা অ্যালগরিদমটি সংশোধন করতে পারি যাতে নিখুঁত ড্রপ পয়েন্টের পরিবর্তে, আমরা সর্বোচ্চ ড্রপ পয়েন্টের একটি সর্বনিম্ন পছন্দ সহ একটি সমন্বয় নির্বাচন করি, তারপরে প্রতিটি পছন্দের জন্য সর্বনিম্ন গণনা করি। উপরের ক্ষেত্রে, মান সহ সমস্ত কক্ষে দুটি সর্বাধিক ড্রপ পয়েন্ট থাকে। উদাহরণস্বরূপ, (0, 1)সর্বোচ্চ ড্রপ পয়েন্ট রয়েছে (1, 1)এবং (1, 2)। যেকোন একটি বেছে নেওয়া এবং তারপরে সর্বনিম্ন গণনা করা এই ফলাফলের দিকে নিয়ে যায়:

Drop bomb on 1, 1
Drop bomb on 2, 2
Drop bomb on 1, 2
Drop bomb on 2, 1
2

এটি উপরে উপস্থাপিত লোভী অ্যালগরিদমকে অনেক সুন্দর করে দেখায়।
darksky

ঠিক আছে, এটি পাশাপাশি একটি লোভী অ্যালগরিদম, তবে কোণ এবং প্রান্তগুলিতে মনোনিবেশ করার পরিবর্তে আমি পরবর্তী ড্রপ পয়েন্টটি কীভাবে চয়ন করব তা সংজ্ঞায়িত করেছি। উদাহরণস্বরূপ 5x7 এর বর্গক্ষেত্রের সাথে 1000x1000 ক্ষেত্রে, কোণগুলির বিষয়ে কথা বলা সহজ, যদি আপনি আমার অ্যালগোরিদম ক্ষেত্রটি সাফ করে সেই ক্রমটি পরীক্ষা করে থাকেন তবে এটি বাইরে থেকে নয়, উপরে থেকে নীচে / বাম থেকে ডানদিকে।
ট্যাম্মো ফ্রিজ

2

এখানে আরও একটি ধারণা দেওয়া হয়েছে:

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

তারপরে ওজন অনুসারে স্পেসের তালিকাটি বাছাই করুন এবং সর্বাধিক ওজন নিয়ে বোমা দিন। এটি আমাদের বাক্সের জন্য সর্বাধিক ঠাঁই পাচ্ছে, তাই বলছি।

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

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

নতুন সর্বোচ্চ ওজনের স্থান বোমা, এবং পদ্ধতি পুনরাবৃত্তি।

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

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


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

হ্যাঁ, এটি একটি ভাল বিষয়, যেহেতু সম্ভাব্য ওজনের কোনও বৃহত পরিসর নেই (কেবল 0 থেকে 9)।
টিম গুডম্যান

আমি এখনও ১০০% নিশ্চিত নই যে ব্যাকট্র্যাকিং কতটা প্রয়োজনীয় ... এমন একটি গ্রিড নির্মাণ করা শিক্ষামূলক হতে পারে যেখানে লোভী বোমা ফেলার একটি পছন্দ অন্যরকম পছন্দ লোভী বোমা ফেলার চেয়ে নিকৃষ্ট। সম্ভবত প্রত্যাশা করার কিছু ধারাবাহিক উপায় রয়েছে যা আরও ভাল।
টিম গুডম্যান

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

3
1010101, 0010100এমন একটি পাল্টা নমুনা হতে পারে যা এই পদ্ধতির অ-অনুকূল হতে প্রমাণ করে। এই পদ্ধতির জন্য 3 প্রয়োজন It এটি 2-এ করা যেতে পারে
রহস্যময়

1

ঠিক আছে, ধরুন আমরা বোর্ডের অবস্থানগুলি 1, 2, ..., এনএক্স মি। বোমা ড্রপের যে কোনও ক্রম এই সংখ্যার ক্রম দ্বারা প্রতিনিধিত্ব করা যেতে পারে, যেখানে সংখ্যাগুলি পুনরাবৃত্তি করতে পারে। যাইহোক, আপনি বোমাটি যে আদেশে ফেলেছেন তা নির্বিশেষে বোর্ডে প্রভাব একই রকম, সুতরাং বোমা ফোঁটার যে কোনও পছন্দই এনএক্সএম সংখ্যার একটি তালিকা হিসাবে প্রতিনিধিত্ব করতে পারে, যেখানে প্রথম সংখ্যাটি পজিশনে ফেলে যাওয়া বোমার সংখ্যাটি উপস্থাপন করে দ্বিতীয় নম্বরটি 2 পজিশনে ফেলে আসা বোমার সংখ্যার প্রতিনিধিত্ব করে etc. ইত্যাদি এনএক্সএম সংখ্যার এই তালিকাটিকে "কী" বলি call

আপনি প্রথমে 1 বোমা ড্রপ থেকে শুরু করে সমস্ত বোর্ডের রাজ্য গণনা করার চেষ্টা করতে পারেন, তারপরে 2 বোমা ফোঁটা ইত্যাদির ফলে সমস্ত বোর্ডের স্টেট গণনা করতে এগুলি ব্যবহার করুন যতক্ষণ না আপনি সমস্ত জিরো পান get তবে প্রতিটি পদক্ষেপে আপনি উপরে বর্ণিত কীটি ব্যবহার করে রাজ্যগুলিকে ক্যাশে করবেন, যাতে আপনি এই ফলাফলগুলি পরবর্তী পদক্ষেপ (একটি "গতিশীল প্রোগ্রামিং" পদ্ধতির) গণনা করে ব্যবহার করতে পারেন।

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


1
সন্দেহের পরে এটি সম্ভব (যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি)। n = মি। আমার 10 ^ 6 ইন্ট পয়েন্টার (10 ^ 6) ^ 2 ইন্টি সেলগুলি দরকার। আমার টেবিলে কীগুলির মতো অনেকগুলি বোর্ড রয়েছে। 10 ^ 12 সন্দেহ আমি 32 বিট মেশিনে এত বরাদ্দ করতে পারি।
এবিসি

হ্যাঁ, আমি বোর্ডগুলি 1000 দ্বারা 1000 পর্যন্ত হওয়া সম্পর্কে আপনার মন্তব্যটি দেখেছি So সুতরাং এটি প্রতিটি বোর্ডের রাজ্যের জন্য এক মিলিয়ন ইনস, সাথে সাথে প্রতিটি পজিশনে বোমা গণনার জন্য এক মিলিয়ন ইনট। সুতরাং আপনার প্রতিটি বোর্ডের জন্য আপনার 2 মিলিয়ন ইনট লাগবে এবং প্রচুর সম্ভাব্য বোর্ড রয়েছে ...
টিম গুডম্যান

আমি একটি দ্বিতীয় উত্তর যুক্ত করেছি যা ভিন্ন পদ্ধতির ব্যবহার করে।
টিম গুডম্যান

1
হ্যাঁ। একধরনের শক্তিশালী বাহিনীর পদ্ধতির মতো, তবে আমি মনে করি একটি বৃহত বোর্ডের জন্য খুব ব্যবহারিক নয়।
টিম গুডম্যান

@ কোস্টেক, এত কম অনুমান কেন? এটি আরও অনেকটা কে ^ (এম * এন) মেমরির মতো যা বোর্ড প্রথম দিকে ভরাট করা সংখ্যার সীমা হিসাবে কে k
রোটসর

1

আপনি যদি বোর্ডটি পরিষ্কার করার জন্য নিখুঁত অনুকূল সমাধান চান তবে আপনাকে ক্লাসিক ব্যাকট্র্যাকিং ব্যবহার করতে হবে, তবে ম্যাট্রিক্সটি যদি খুব বড় হয় তবে সেরা সমাধানটি পেতে বয়সগুলি লাগবে, যদি আপনি "সম্ভাব্য" অনুকূল সমাধান চান তবে আপনি লোভী অ্যালগরিদম ব্যবহার করতে পারেন , আপনার যদি অ্যালগরিদম লিখতে সাহায্যের প্রয়োজন হয় আমি আপনাকে সহায়তা করতে পারি

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

2 3 5 -> (2+(1*3)) (3+(1*5)) (5+(1*3))
1 3 2 -> (1+(1*4)) (3+(1*7)) (2+(1*4))
1 0 2 -> (1+(1*2)) (0+(1*5)) (2+(1*2))

0 এর চেয়ে বেশি মান সহ প্রতিটি সংলগ্ন কক্ষের জন্য সেল মান +1


7
ক্লাসিক ব্যাকট্র্যাকিং ব্যবহার করতে হবে । আপনি কি এই জন্য একটি প্রমাণ আছে?
শাহবাজ

আমি নিশ্চিত নই. এটি প্রতিযোগিতা থেকে প্রস্তুত আমি (পূর্ববর্তী বছর থেকে)। সীমাগুলি 1 <= n, এম <= 1000 (বড় কিনা তা জানেন না)। যাইহোক আপনার সঠিক উত্তর প্রয়োজন (এটি সিইআরসি প্রতিযোগিতার অনুরূপ এবং অন্যান্য)। সময় সীমা কোনও দেওয়া হয়নি, কোনও উত্তর নেই, প্রতিযোগিতার পৃষ্ঠায় কোনও সমাধান নেই।
abc

ভাল প্রতিটি অন্যান্য অ্যালগরিদম আপনাকে একটি সম্ভাব্য সর্বোত্তম সমাধান দেবে তবে আপনি যতক্ষণ না সেগুলি সব চেষ্টা করেন (ব্যাকট্র্যাকিং) আপনি জানেন না যে সমাধানটি সেরা
কিনা

2
আপনার ব্যাকট্র্যাকিং ব্যবহার করার দরকার নেই কারণ এটি অনুসন্ধানের সংমিশ্রণ, অনুমতি নয় a বোমা ফেলে দেওয়ার
ক্রমটি

তারপরে আপনি লোভীর একটি প্রকরণ ব্যবহার করার চেষ্টা করতে পারেন। প্রতিটি পদক্ষেপে একটি নতুন ম্যাট্রিক্স তৈরি করুন এবং প্রতিটি পয়েন্টের তার পাশে থাকা প্রতিটি কক্ষের জন্য তার ঘরের মান +1 থাকবে> 0 এভাবে পরের বোমাগুলি কোথায় ফেলে রাখা যায় তা আরও ভালভাবে বেছে
নেবে

1

পাশবিক বল !

আমি জানি এটি দক্ষ নয়, তবে আপনি যদি একটি দ্রুত অ্যালগোরিদম খুঁজে পান তবে এটি কতটা সঠিক তা জানতে আপনি সর্বদা এই ফলাফলের বিরুদ্ধে পরীক্ষা করতে পারেন।

কিছু পুনরাবৃত্তি ব্যবহার করুন:

void fn(tableState ts, currentlevel cl)
{
  // first check if ts is all zeros yet, if not:
  //
  // do a for loop to go through all cells of ts, 
  // for each cell do a bomb, and then
  // call: 
  // fn(ts, cl + 1);

}

আপনি ক্যাশে করে এটিকে আরও দক্ষ করে তুলতে পারেন, যদি ভিন্ন উপায়ে একই ফলাফলের দিকে পরিচালিত করে, আপনার একই ধাপগুলি পুনরাবৃত্তি করা উচিত নয়।

সম্প্রসারিত:

যদি 1,3,5 সেল বোমা ফাটিয়ে সেল 5,3,1 তে বোমা ফেলার একই ফলাফলের দিকে নিয়ে যায়, তবে, উভয় মামলার জন্য আপনাকে পরবর্তী সমস্ত পদক্ষেপগুলি পুনরায় না করা উচিত, কেবল 1 টি যথেষ্ট, আপনার সমস্ত জায়গা কোথাও সংরক্ষণ করা উচিত টেবিলটি বর্ণনা করে এবং এর ফলাফলগুলি ব্যবহার করে।

দ্রুত তুলনা করতে টেবিলের পরিসংখ্যানগুলির একটি হ্যাশ ব্যবহার করা যেতে পারে।


1
  1. কখনই সীমানা বোমাবেন না (স্কয়ারে সীমান্ত প্রতিবেশী না থাকলে)
  2. জিরো কর্নার
  3. শূন্য কোণে, কোণার এক বর্গাকার দূরে ডায়াগনালি (একমাত্র নন সীমান্ত প্রতিবেশী) এর ড্রপ মান
  4. এটি নতুন কোণ তৈরি করবে। 2 এ যান

সম্পাদনা: খেয়াল করেন নি যে কোস্টেক প্রায় একই পদ্ধতির পরামর্শ দিয়েছিল, তাই এখন আমি আরও দৃ claim় দাবি করছি: যদি সাফ করার কোণগুলি সর্বদা বহিরাগত স্তরে থাকে বলে বেছে নেওয়া হয়, তবে এটি সর্বোত্তম।

ওপি'র উদাহরণে: 5 এর চেয়ে অন্য যে কোনও কিছুতে 2 (1 + 1 বা 2 হিসাবে) বাদ দেওয়া কোনও স্কোয়ারে আঘাত হ্রাস করে না যা 5 এ নেমে আসে। সুতরাং আমাদের কেবল 5 এ 2 ড্রপ করতে হবে (এবং নীচে বাম দিকে 1 ...)

এর পরে, কেবলমাত্র একটি উপায় আছে কীভাবে (উপরে বাম দিকে) কোণটি কী কী মৌলিক 1 (এখন 0) ছিল, এবং তা হল বি 3 তে 0 নামিয়ে (স্বরলিখনের মতো এক্সেল)। ইত্যাদি।

পুরো এ এবং ই কলাম এবং 1 এবং 7 সারিগুলি সাফ করার পরে, এক স্তর আরও গভীর করে সাফ করা শুরু করুন।

কেবল সেই ইচ্ছাকৃত পরিষ্কার করা বিবেচনা করুন, 0 মান কোণগুলি সাফ করার জন্য কোনও মূল্য ব্যয় হয় না এবং এটি সম্পর্কে চিন্তাভাবনাকে সহজ করে।

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


ভাল ঘুমের পরে আমি বুঝতে পারি যে এটি সত্য নয়। বিবেচনা

  ABCDE    
1 01000
2 10000
3 00000
4 00000

আমার পদ্ধতির বি 3 এবং সি 2 এ বোমা ফেলা হবে, যখন বি 2 এ ফেলে দেওয়া যথেষ্ট হবে


তবে এটি কি সর্বোত্তম?
রহস্যময়

7
নতুন কোণগুলিকে ২ টি উপায়ে বোমা দেওয়া যেতে পারে (যদি বেশিরভাগ কোণে সমস্ত 4 টির মান থাকে) of কোনটি সর্বোত্তম বোমা হামলা করছে?
abc

আমি একই ধরণের পদ্ধতির কথা ভাবছিলাম, এবং আপনি যখন বর্ণিত কোস্টেকের মতো পরিস্থিতিতে পৌঁছেছেন, তখন ব্যাকট্র্যাকিং ব্যবহার শুরু করুন ...
করলি হরভথ

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

নতুন কোণার তির্যকটি চয়ন করার বিষয়ে কী যা হিট বাক্সে সর্বোচ্চ মোট গণনা দেয়?
বিচারক মেগার্ডেন

1

এখানে আমার সমাধানটি রয়েছে .. আমার কাছে সময় নেই বলে আমি এখনও কোডটিতে এটি লিখব না, তবে আমি বিশ্বাস করি এটি প্রতিবারই সর্বাধিক সংখ্যক চলন তৈরি করতে হবে - যদিও এটি সন্ধানের ক্ষেত্রে কতটা দক্ষ হবে তা আমি নিশ্চিত নই বোমা পয়েন্ট।

প্রথমত, @ লুকা রাহনে যেমন একটি মন্তব্যে বলেছিলেন, আপনি যে ক্রমটি বোমাচ্ছেন সেটি গুরুত্বপূর্ণ নয় - কেবল সম্মিলন।

দ্বিতীয়ত, অন্য অনেকের বক্তব্য অনুসারে, কোণগুলি থেকে 1-অফ তির্যক বোমা ফাটানো সর্বোত্তম কারণ এটি কোণগুলির চেয়ে বেশি পয়েন্টগুলিকে স্পর্শ করে।

এটি আমার অ্যালগরিদমের সংস্করণটির ভিত্তি তৈরি করে: আমরা প্রথম বা শেষ পর্যন্ত '1-অফ' বোমাতে পারি, এটি কোনও ব্যাপার নয় (তাত্ত্বিকভাবে) আমরা প্রথমে বোমা ফেলি কারণ এটি পরবর্তী সিদ্ধান্তগুলি সহজ করে তোলে (বাস্তবে) আমরা সেই পয়েন্টটি বোমা করি যা সবচেয়ে বেশি পয়েন্টগুলিকে প্রভাবিত করে, একই সাথে সেই কোণগুলিতে বোমা ফেলা হয়।

আসুন প্রতিরোধের পয়েন্টগুলি বোর্ডের পয়েন্টগুলি হিসাবে সর্বাধিক বোমাবিহীন পয়েন্টগুলি + এর আশেপাশে 0 এর বৃহত্তম সংখ্যার হিসাবে সংজ্ঞায়িত করি

বোমাবিহীন পয়েন্টগুলিকে পয়েন্ট হিসাবে সংজ্ঞায়িত করা যায় যা আমাদের বর্তমান সুযোগে নেই বোর্ড আমরা এ খুঁজছেন হয়েছে।

আমি 4 টি বাউন্ডও সংজ্ঞায়িত করব যা আমাদের স্কোপ পরিচালনা করবে: শীর্ষ = 0, বাম = 0, নীচে = কে, ডান = জ j (শুরু করার মানগুলি)

অবশেষে, আমি অনুকূল বোমা সংজ্ঞায়িত করব হিসাবে যা প্রতিরোধের পয়েন্টের সংলগ্ন এবং পয়েন্টগুলিতে ফেলে দেওয়া হয় (1) প্রতিরোধের সর্বোচ্চ মূল্যবান পয়েন্ট এবং (2) সম্ভাব্যতম পয়েন্টগুলির স্পর্শ করছে।

পদ্ধতির বিষয়ে- এটি স্পষ্টতই আমরা বাইরে থেকে কাজ করছি We আমরা একই সাথে 4 'বোমারু বিমানের' সাথে কাজ করতে সক্ষম হব।

প্রতিরোধের প্রথম পয়েন্টগুলি অবশ্যই আমাদের কোণগুলি। 'আউট অফ বাউন্ড' পয়েন্টগুলি বোমাবর্ষণযোগ্য নয় (প্রতিটি কোণার সুযোগের বাইরে 5 পয়েন্ট রয়েছে)। সুতরাং আমরা বিন্দুগুলি কোণার বাইরে প্রথমে বোমা ফেলি।

অ্যালগরিদম:

  1. 4 অনুকূল বোমা পয়েন্টগুলি সন্ধান করুন।
  2. যদি কোনও বোমা বিন্দু একটি প্রতিরোধের পয়েন্টটি বোমাচ্ছে যা 2 টি সীমানা (অর্থাত্ একটি কোণে) স্পর্শ করে, তবে সেই বিন্দুটি 0 হওয়া পর্যন্ত বোমাটি বোনা হয় Otherwise
  3. প্রতিটি বাউন্ডের জন্য: যদি (যোগফল (আবদ্ধ) == 0) অগ্রিম গণ্ডি

শীর্ষ = বটম এবং বামে = ডান অবধি পুনরাবৃত্তি করুন

আমি আসল কোডটি পরে লেখার চেষ্টা করব


1

আপনি রাষ্ট্রীয় স্থান পরিকল্পনা ব্যবহার করতে পারেন। উদাহরণস্বরূপ, এ * (বা এর কোনও একটি রূপ) ব্যবহার করে এর f = g + hমতো হিউরিস্টিক যুক্ত :

  • g: এতক্ষণ বোমা ফেলেছে
  • এইচ: গ্রিডের 9 টি দ্বারা বিভক্ত সমস্ত মানগুলির সমষ্টি (যা সেরা ফলাফল, যার অর্থ আমাদের কাছে একটি গ্রহণযোগ্য হিউরিস্টিকস রয়েছে)

1

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

number-of-zeros / number-of-groups-of-zeros

এই হাস্কেল "সমাধান বোর্ড" ইঞ্জিনের সমাধান দেখায়। আপনি "মূল" টাইপ করে গেমটি খেলতে পারবেন, তারপরে একটি লক্ষ্য বিন্দুতে প্রবেশ করুন, একটি সুপারিশের জন্য "সেরা", বা "ছাড়ুন" ছেড়ে দিতে পারেন।

আউটপুট:
* প্রধান> সমাধান বোর্ড
[(৪,৪), (৩, 3,), (৩,৩), (২,২), (২,২), (৪,6), (৪,6), (2,6), (3,2), (4,2), (2,6), (3,3), (4,3), (2,6), (4,2), (4 6), (4,6), (3,6), (2,6), (2,6), (2,4), (2,4), (2,6), (3,6 ), (4,2), (4,2), (4,2), (4,2)]

import Data.List
import Data.List.Split
import Data.Ord
import Data.Function(on)

board = [2,3,4,7,1,
         1,5,2,6,2,
         4,3,4,2,1,
         2,1,2,4,1,
         3,1,3,4,1,
         2,1,4,3,2,
         6,9,1,6,4]

n = 5
m = 7

updateBoard board pt =
  let x = fst pt
      y = snd pt
      precedingLines = replicate ((y-2) * n) 0
      bomb = concat $ replicate (if y == 1
                                    then 2
                                    else min 3 (m+2-y)) (replicate (x-2) 0 
                                                         ++ (if x == 1 
                                                                then [1,1]
                                                                else replicate (min 3 (n+2-x)) 1)
                                                                ++ replicate (n-(x+1)) 0)
  in zipWith (\a b -> max 0 (a-b)) board (precedingLines ++ bomb ++ repeat 0)

showBoard board = 
  let top = "   " ++ (concat $ map (\x -> show x ++ ".") [1..n]) ++ "\n"
      chunks = chunksOf n board
  in putStrLn (top ++ showBoard' chunks "" 1)
       where showBoard' []     str count = str
             showBoard' (x:xs) str count =
               showBoard' xs (str ++ show count ++ "." ++ show x ++ "\n") (count+1)

instances _ [] = 0
instances x (y:ys)
  | x == y    = 1 + instances x ys
  | otherwise = instances x ys

density a = 
  let numZeros = instances 0 a
      groupsOfZeros = filter (\x -> head x == 0) (group a)
  in if null groupsOfZeros then 0 else numZeros / fromIntegral (length groupsOfZeros)

boardDensity board = sum (map density (chunksOf n board))

moves = [(a,b) | a <- [2..n-1], b <- [2..m-1]]               

bestMove board = 
  let lowestSumMoves = take 1 $ groupBy ((==) `on` snd) 
                              $ sortBy (comparing snd) (map (\x -> (x, sum $ updateBoard board x)) (moves))
  in if null lowestSumMoves
        then (0,0)
        else let lowestSumMoves' = map (\x -> fst x) (head lowestSumMoves) 
             in fst $ head $ reverse $ sortBy (comparing snd) 
                (map (\x -> (x, boardDensity $ updateBoard board x)) (lowestSumMoves'))   

solve board = solve' board [] where
  solve' board result
    | sum board == 0 = result
    | otherwise      = 
        let best = bestMove board 
        in solve' (updateBoard board best) (result ++ [best])

main :: IO ()
main = mainLoop board where
  mainLoop board = do 
    putStrLn ""
    showBoard board
    putStr "Pt: "
    a <- getLine
    case a of 
      "quit"    -> do putStrLn ""
                      return ()
      "best"    -> do putStrLn (show $ bestMove board)
                      mainLoop board
      otherwise -> let ws = splitOn "," a
                       pt = (read (head ws), read (last ws))
                   in do mainLoop (updateBoard board pt)

1

এখানে একটি নন-পার্টির মিলের মতো কাঠামো আছে বলে মনে হচ্ছে। নিম্নলিখিত উদাহরণ বিবেচনা করুন:

0010000
1000100
0000001
1000000
0000001
1000100
0010000

এই প্রকারের সর্বোত্তম সমাধানটির আকার 5 রয়েছে যেহেতু এটি 9 টি চক্রের শীর্ষ প্রান্তের একটি সর্বনিম্ন কভারের আকার its

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

আমি নিকৃষ্টতম সময়ে সবচেয়ে খারাপ ক্ষেত্রে এটি সমাধান করার উপায় দেখছি না। খুব চালাক বাইনারি-অনুসন্ধান-এবং-ডিপি সমাধান হতে পারে যা আমি দেখছি না।

সম্পাদনা : আমি দেখতে পাচ্ছি যে প্রতিযোগিতাটি ( http://deadline24.pl ) ভাষা-অজ্ঞাতদৃষ্টিক; তারা আপনাকে একগুচ্ছ ইনপুট ফাইল প্রেরণ করে এবং আপনি তাদের আউটপুট প্রেরণ করেন। সুতরাং আপনার এমন কিছু দরকার নেই যা সবচেয়ে খারাপ ক্ষেত্রে বহাল থাকে। বিশেষত, আপনি ইনপুটটি দেখতে পাবেন !

ইনপুটটিতে বেশ কয়েকটি ছোট ছোট মামলা রয়েছে। তারপরে একটি 10x1000 কেস, একটি 100x100 কেস এবং 1000x1000 কেস রয়েছে। তিনটি বৃহত কেস সবই খুব ভাল আচরণ করা। অনুভূমিকভাবে সংলগ্ন এন্ট্রিগুলির সাধারণত একই মান থাকে। তুলনামূলকভাবে মৌমাছির মেশিনে, আমি কয়েক মিনিটের মধ্যে সিপ্লেএক্স ব্যবহার করে ব্রুট-জোর করে সমস্ত ক্ষেত্রে সমাধান করতে সক্ষম হয়েছি। আমি 1000x1000 এ ভাগ্যবান হয়েছি; এলপি শিথিলতার একটি অবিচ্ছেদ্য অনুকূল সমাধান ঘটে। আমার সমাধানগুলি .ansপরীক্ষার ডেটা বান্ডেলে সরবরাহ করা ফাইলগুলির সাথে একমত হয় ।

আমি বাজি ধরতাম আপনি যদি ইনপুটটির কাঠামোটি আমার চেয়ে অনেক বেশি সরাসরি উপায়ে ব্যবহার করতে পারেন তবে যদি আপনি এটি একবার খেয়াল করেন; মনে হচ্ছে আপনি প্রথম সারিতে কেবল দুটি বা তিন বা তিনটি বার বার করতে পারেন যতক্ষণ না আপনি কিছু না রেখে পান। (মনে হচ্ছে, 1000x1000-এ, সারিগুলির সমস্তই অযৌক্তিক? আমার অনুমান যে আপনার "পার্ট বি" কোথা থেকে এসেছে?)


হা. কখনও কখনও আমি পাঠ্যের "অপ্রাসঙ্গিক" অংশটি এড়িয়ে যাই। সংক্ষেপে ধারণা পেতে এবং আরও কিছু। এবার এটি মূলত স্তরটিকে সহজ থেকে কঠিন হিসাবে নরকের মতো পরিবর্তন করেছে: পি যাইহোক আমি জানি আপনি "জ্ঞাত" ইনপুট সেটটি বানাতে চেষ্টা করতে পারেন। অন্যদিকে আমি কেবল মনে করি যে উত্তরটি যদি পয়েন্ট পয়েন্ট না হয় তবে কিছু অ্যালগরিদম অবশ্যই থাকতে হবে যা 5 ঘন্টা চলাকালীন সহজেই সম্পাদন করবে। আমি যে সব পেয়েছি তার মধ্যে খুব বড় জটিলতা ছিল। তারপরে আমি আরও মনোযোগ সহকারে পড়লাম, যখন কেউ উত্স সম্পর্কে জিজ্ঞাসা করেছে :)
এবি

আমরা ধন্যবাদ বলতে পারি যে অনেক লোকের খুব ভাল সমস্যা হয়েছে, সে সম্পর্কে ভাবার জন্য, তবে সন্দেহ এটি বহুবারের মধ্যে হতে পারে। এটি মজার বিষয় যে কীভাবে একটি সহজ প্রতিবন্ধকতা, কার্যের স্তরটিকে সহজ থেকে অসম্ভবকে পরিবর্তন করে।
abc

@ কোস্টেক: দুঃখিত যদি আমি অস্পষ্ট ছিলাম। আমি ... দর্শকদের জন্য উপযুক্ত স্তরে ব্যাখ্যার পিছনে বেশ খারাপ। :) আমি কোথায় অস্পষ্ট ছিল?
tmyklebu

1

আমি আমার সেরা হিউরিস্টিক ব্যবহার করে বোমা ফাটানো অভিযানটি গণনা না করে আসল সংখ্যা গণনা করার কোনও উপায় সম্পর্কে ভাবতে পারি না এবং আশা করি আমি যুক্তিসঙ্গত ফলাফল পাব।

সুতরাং আমার পদ্ধতিটি হ'ল প্রতিটি কক্ষের জন্য একটি বোমা বিস্ফোরণ দক্ষতা মেট্রিক গণনা করা, সেলের সর্বোচ্চ মান সহ বোমা, .... প্রক্রিয়াটি পুনরাবৃত্তি করুন যতক্ষণ না আমি সবকিছু চ্যাপ্টা না করি। কেউ কেউ মেট্রিক হিসাবে সাধারণ সম্ভাব্য ক্ষতির (উদাহরণস্বরূপ ০ থেকে ৯ পর্যন্ত) ব্যবহার করার পক্ষে পরামর্শ দিয়েছেন, তবে এটি উচ্চ মানের কোষগুলিকে পাউন্ডিং করে এবং ক্ষতির ওভারল্যাপ ব্যবহার না করে সংক্ষিপ্ত হয়ে পড়ে। আমি গণনা করব cell value - sum of all neighbouring cells, যেকোন ধনাত্মককে 0 এ পুনরায় সেট করব এবং নেতিবাচক যে কোনও কিছুর পরম মান ব্যবহার করব। স্বাচ্ছন্দ্যের সাথে এই মেট্রিকের এমন একটি নির্বাচন করা উচিত যা সরাসরি গণ্ডগোলের পরিবর্তে উচ্চতর সংখ্যার সাথে সেলগুলিতে ক্ষতির ওভারল্যাপকে সর্বাধিক সহায়তা করতে পারে।

নীচের কোডটি 28 টি বোমাতে পরীক্ষার ক্ষেত্রের সর্বনাশকে পৌঁছেছে (নোট করুন যে সম্ভাব্য ক্ষতিটি মেট্রিক হিসাবে 31 টি ফলন দেয়!)।

using System;
using System.Collections.Generic;
using System.Linq;

namespace StackOverflow
{
  internal class Program
  {
    // store the battle field as flat array + dimensions
    private static int _width = 5;
    private static int _length = 7;
    private static int[] _field = new int[] {
        2, 3, 4, 7, 1,
        1, 5, 2, 6, 2,
        4, 3, 4, 2, 1,
        2, 1, 2, 4, 1,
        3, 1, 3, 4, 1,
        2, 1, 4, 3, 2,
        6, 9, 1, 6, 4
    };
    // this will store the devastation metric
    private static int[] _metric;

    // do the work
    private static void Main(string[] args)
    {
        int count = 0;

        while (_field.Sum() > 0)
        {
            Console.Out.WriteLine("Round {0}:", ++count);
            GetBlastPotential();
            int cell_to_bomb = FindBestBombingSite();
            PrintField(cell_to_bomb);
            Bomb(cell_to_bomb);
        }
        Console.Out.WriteLine("Done in {0} rounds", count);
    } 

    // convert 2D position to 1D index
    private static int Get1DCoord(int x, int y)
    {
        if ((x < 0) || (y < 0) || (x >= _width) || (y >= _length)) return -1;
        else
        {
            return (y * _width) + x;
        }
    }

    // Convert 1D index to 2D position
    private static void Get2DCoord(int n, out int x, out int y)
    {
        if ((n < 0) || (n >= _field.Length))
        {
            x = -1;
            y = -1;
        }
        else
        {
            x = n % _width;
            y = n / _width;
        }
    }

    // Compute a list of 1D indices for a cell neighbours
    private static List<int> GetNeighbours(int cell)
    {
        List<int> neighbours = new List<int>();
        int x, y;
        Get2DCoord(cell, out x, out y);
        if ((x >= 0) && (y >= 0))
        {
            List<int> tmp = new List<int>();
            tmp.Add(Get1DCoord(x - 1, y - 1));
            tmp.Add(Get1DCoord(x - 1, y));
            tmp.Add(Get1DCoord(x - 1, y + 1));
            tmp.Add(Get1DCoord(x, y - 1));
            tmp.Add(Get1DCoord(x, y + 1));
            tmp.Add(Get1DCoord(x + 1, y - 1));
            tmp.Add(Get1DCoord(x + 1, y));
            tmp.Add(Get1DCoord(x + 1, y + 1));

            // eliminate invalid coords - i.e. stuff past the edges
            foreach (int c in tmp) if (c >= 0) neighbours.Add(c);
        }
        return neighbours;
    }

    // Compute the devastation metric for each cell
    // Represent the Value of the cell minus the sum of all its neighbours
    private static void GetBlastPotential()
    {
        _metric = new int[_field.Length];
        for (int i = 0; i < _field.Length; i++)
        {
            _metric[i] = _field[i];
            List<int> neighbours = GetNeighbours(i);
            if (neighbours != null)
            {
                foreach (int j in neighbours) _metric[i] -= _field[j];
            }
        }
        for (int i = 0; i < _metric.Length; i++)
        {
            _metric[i] = (_metric[i] < 0) ? Math.Abs(_metric[i]) : 0;
        }
    }

    //// Compute the simple expected damage a bomb would score
    //private static void GetBlastPotential()
    //{
    //    _metric = new int[_field.Length];
    //    for (int i = 0; i < _field.Length; i++)
    //    {
    //        _metric[i] = (_field[i] > 0) ? 1 : 0;
    //        List<int> neighbours = GetNeighbours(i);
    //        if (neighbours != null)
    //        {
    //            foreach (int j in neighbours) _metric[i] += (_field[j] > 0) ? 1 : 0;
    //        }
    //    }            
    //}

    // Update the battle field upon dropping a bomb
    private static void Bomb(int cell)
    {
        List<int> neighbours = GetNeighbours(cell);
        foreach (int i in neighbours)
        {
            if (_field[i] > 0) _field[i]--;
        }
    }

    // Find the best bombing site - just return index of local maxima
    private static int FindBestBombingSite()
    {
        int max_idx = 0;
        int max_val = int.MinValue;
        for (int i = 0; i < _metric.Length; i++)
        {
            if (_metric[i] > max_val)
            {
                max_val = _metric[i];
                max_idx = i;
            }
        }
        return max_idx;
    }

    // Display the battle field on the console
    private static void PrintField(int cell)
    {
        for (int x = 0; x < _width; x++)
        {
            for (int y = 0; y < _length; y++)
            {
                int c = Get1DCoord(x, y);
                if (c == cell)
                    Console.Out.Write(string.Format("[{0}]", _field[c]).PadLeft(4));
                else
                    Console.Out.Write(string.Format(" {0} ", _field[c]).PadLeft(4));
            }
            Console.Out.Write(" || ");
            for (int y = 0; y < _length; y++)
            {
                int c = Get1DCoord(x, y);
                if (c == cell)
                    Console.Out.Write(string.Format("[{0}]", _metric[c]).PadLeft(4));
                else
                    Console.Out.Write(string.Format(" {0} ", _metric[c]).PadLeft(4));
            }
            Console.Out.WriteLine();
        }
        Console.Out.WriteLine();
    }           
  }
}

ফলস্বরূপ বোমার ধরণটি নিম্নরূপ আউটপুট (বামদিকে ক্ষেত্রের মান, ডানদিকে মেট্রিক)

Round 1:
  2   1   4   2   3   2   6  ||   7  16   8  10   4  18   6
  3   5   3   1   1   1   9  ||  11  18  18  21  17  28   5
  4  [2]  4   2   3   4   1  ||  19 [32] 21  20  17  24  22
  7   6   2   4   4   3   6  ||   8  17  20  14  16  22   8
  1   2   1   1   1   2   4  ||  14  15  14  11  13  16   7

Round 2:
  2   1   4   2   3   2   6  ||   5  13   6   9   4  18   6
  2   4   2   1   1  [1]  9  ||  10  15  17  19  17 [28]  5
  3   2   3   2   3   4   1  ||  16  24  18  17  17  24  22
  6   5   1   4   4   3   6  ||   7  14  19  12  16  22   8
  1   2   1   1   1   2   4  ||  12  12  12  10  13  16   7

Round 3:
  2   1   4   2   2   1   5  ||   5  13   6   7   3  15   5
  2   4   2   1   0   1   8  ||  10  15  17  16  14  20   2
  3  [2]  3   2   2   3   0  ||  16 [24] 18  15  16  21  21
  6   5   1   4   4   3   6  ||   7  14  19  11  14  19   6
  1   2   1   1   1   2   4  ||  12  12  12  10  13  16   7

Round 4:
  2   1   4   2   2   1   5  ||   3  10   4   6   3  15   5
  1   3   1   1   0   1   8  ||   9  12  16  14  14  20   2
  2   2   2   2   2  [3]  0  ||  13  16  15  12  16 [21] 21
  5   4   0   4   4   3   6  ||   6  11  18   9  14  19   6
  1   2   1   1   1   2   4  ||  10   9  10   9  13  16   7

Round 5:
  2   1   4   2   2   1   5  ||   3  10   4   6   2  13   3
  1   3   1   1   0  [0]  7  ||   9  12  16  13  12 [19]  2
  2   2   2   2   1   3   0  ||  13  16  15  10  14  15  17
  5   4   0   4   3   2   5  ||   6  11  18   7  13  17   6
  1   2   1   1   1   2   4  ||  10   9  10   8  11  13   5

Round 6:
  2   1   4   2   1   0   4  ||   3  10   4   5   2  11   2
  1   3   1   1   0   0   6  ||   9  12  16  11   8  13   0
  2   2   2   2   0   2   0  ||  13  16  15   9  14  14  15
  5   4  [0]  4   3   2   5  ||   6  11 [18]  6  11  15   5
  1   2   1   1   1   2   4  ||  10   9  10   8  11  13   5

Round 7:
  2   1   4   2   1   0   4  ||   3  10   4   5   2  11   2
  1   3   1   1   0   0   6  ||   8  10  13   9   7  13   0
  2  [1]  1   1   0   2   0  ||  11 [15] 12   8  12  14  15
  5   3   0   3   3   2   5  ||   3   8  10   3   8  15   5
  1   1   0   0   1   2   4  ||   8   8   7   7   9  13   5

Round 8:
  2   1   4   2   1   0   4  ||   1   7   2   4   2  11   2
  0   2   0   1   0   0   6  ||   7   7  12   7   7  13   0
  1   1   0   1   0   2   0  ||   8   8  10   6  12  14  15
  4   2   0   3   3  [2]  5  ||   2   6   8   2   8 [15]  5
  1   1   0   0   1   2   4  ||   6   6   6   7   9  13   5

Round 9:
  2   1   4   2   1   0   4  ||   1   7   2   4   2  11   2
  0   2   0   1   0   0   6  ||   7   7  12   7   6  12   0
  1   1   0   1   0  [1]  0  ||   8   8  10   5  10 [13] 13
  4   2   0   3   2   2   4  ||   2   6   8   0   6   9   3
  1   1   0   0   0   1   3  ||   6   6   6   5   8  10   4

Round 10:
  2   1   4   2   1   0   4  ||   1   7   2   4   2  10   1
  0   2  [0]  1   0   0   5  ||   7   7 [12]  7   6  11   0
  1   1   0   1   0   1   0  ||   8   8  10   4   8   9  10
  4   2   0   3   1   1   3  ||   2   6   8   0   6   8   3
  1   1   0   0   0   1   3  ||   6   6   6   4   6   7   2

Round 11:
  2   0   3   1   1   0   4  ||   0   6   0   3   0  10   1
  0   1   0   0   0  [0]  5  ||   4   5   5   5   3 [11]  0
  1   0   0   0   0   1   0  ||   6   8   6   4   6   9  10
  4   2   0   3   1   1   3  ||   1   5   6   0   5   8   3
  1   1   0   0   0   1   3  ||   6   6   6   4   6   7   2

Round 12:
  2   0   3   1   0   0   3  ||   0   6   0   2   1   7   1
  0   1   0   0   0   0   4  ||   4   5   5   4   1   7   0
  1   0   0   0   0  [0]  0  ||   6   8   6   4   5  [9]  8
  4   2   0   3   1   1   3  ||   1   5   6   0   4   7   2
  1   1   0   0   0   1   3  ||   6   6   6   4   6   7   2

Round 13:
  2   0   3   1   0   0   3  ||   0   6   0   2   1   6   0
  0   1   0   0   0   0   3  ||   4   5   5   4   1   6   0
  1  [0]  0   0   0   0   0  ||   6  [8]  6   3   3   5   5
  4   2   0   3   0   0   2  ||   1   5   6   0   4   6   2
  1   1   0   0   0   1   3  ||   6   6   6   3   4   4   0

Round 14:
  2   0   3   1   0  [0]  3  ||   0   5   0   2   1  [6]  0
  0   0   0   0   0   0   3  ||   2   5   4   4   1   6   0
  0   0   0   0   0   0   0  ||   4   4   4   3   3   5   5
  3   1   0   3   0   0   2  ||   0   4   5   0   4   6   2
  1   1   0   0   0   1   3  ||   4   4   5   3   4   4   0

Round 15:
  2   0   3   1   0   0   2  ||   0   5   0   2   1   4   0
  0   0   0   0   0   0   2  ||   2   5   4   4   1   4   0
  0   0   0   0   0   0   0  ||   4   4   4   3   3   4   4
  3   1   0   3   0  [0]  2  ||   0   4   5   0   4  [6]  2
  1   1   0   0   0   1   3  ||   4   4   5   3   4   4   0

Round 16:
  2  [0]  3   1   0   0   2  ||   0  [5]  0   2   1   4   0
  0   0   0   0   0   0   2  ||   2   5   4   4   1   4   0
  0   0   0   0   0   0   0  ||   4   4   4   3   3   3   3
  3   1   0   3   0   0   1  ||   0   4   5   0   3   3   1
  1   1   0   0   0   0   2  ||   4   4   5   3   3   3   0

Round 17:
  1   0   2   1   0   0   2  ||   0   3   0   1   1   4   0
  0   0   0   0   0   0   2  ||   1   3   3   3   1   4   0
  0   0   0   0   0   0   0  ||   4   4   4   3   3   3   3
  3   1  [0]  3   0   0   1  ||   0   4  [5]  0   3   3   1
  1   1   0   0   0   0   2  ||   4   4   5   3   3   3   0

Round 18:
  1   0   2   1   0   0   2  ||   0   3   0   1   1   4   0
  0   0   0   0   0   0   2  ||   1   3   3   3   1   4   0
  0   0   0   0   0   0   0  ||   3   3   2   2   2   3   3
  3  [0]  0   2   0   0   1  ||   0  [4]  2   0   2   3   1
  1   0   0   0   0   0   2  ||   2   4   2   2   2   3   0

Round 19:
  1   0   2   1   0  [0]  2  ||   0   3   0   1   1  [4]  0
  0   0   0   0   0   0   2  ||   1   3   3   3   1   4   0
  0   0   0   0   0   0   0  ||   2   2   2   2   2   3   3
  2   0   0   2   0   0   1  ||   0   2   2   0   2   3   1
  0   0   0   0   0   0   2  ||   2   2   2   2   2   3   0

Round 20:
  1  [0]  2   1   0   0   1  ||   0  [3]  0   1   1   2   0
  0   0   0   0   0   0   1  ||   1   3   3   3   1   2   0
  0   0   0   0   0   0   0  ||   2   2   2   2   2   2   2
  2   0   0   2   0   0   1  ||   0   2   2   0   2   3   1
  0   0   0   0   0   0   2  ||   2   2   2   2   2   3   0

Round 21:
  0   0   1   1   0   0   1  ||   0   1   0   0   1   2   0
  0   0   0   0   0   0   1  ||   0   1   2   2   1   2   0
  0   0   0   0   0   0   0  ||   2   2   2   2   2   2   2
  2   0   0   2   0  [0]  1  ||   0   2   2   0   2  [3]  1
  0   0   0   0   0   0   2  ||   2   2   2   2   2   3   0

Round 22:
  0   0   1   1   0   0   1  ||   0   1   0   0   1   2   0
  0   0   0   0   0   0   1  ||   0   1   2   2   1   2   0
 [0]  0   0   0   0   0   0  ||  [2]  2   2   2   2   1   1
  2   0   0   2   0   0   0  ||   0   2   2   0   2   1   1
  0   0   0   0   0   0   1  ||   2   2   2   2   2   1   0

Round 23:
  0   0   1   1   0   0   1  ||   0   1   0   0   1   2   0
  0   0  [0]  0   0   0   1  ||   0   1  [2]  2   1   2   0
  0   0   0   0   0   0   0  ||   1   1   2   2   2   1   1
  1   0   0   2   0   0   0  ||   0   1   2   0   2   1   1
  0   0   0   0   0   0   1  ||   1   1   2   2   2   1   0

Round 24:
  0   0   0   0   0   0   1  ||   0   0   0   0   0   2   0
  0   0   0   0   0   0   1  ||   0   0   0   0   0   2   0
  0   0  [0]  0   0   0   0  ||   1   1  [2]  2   2   1   1
  1   0   0   2   0   0   0  ||   0   1   2   0   2   1   1
  0   0   0   0   0   0   1  ||   1   1   2   2   2   1   0

Round 25:
  0   0   0   0   0  [0]  1  ||   0   0   0   0   0  [2]  0
  0   0   0   0   0   0   1  ||   0   0   0   0   0   2   0
  0   0   0   0   0   0   0  ||   1   1   1   1   1   1   1
  1   0   0   1   0   0   0  ||   0   1   1   0   1   1   1
  0   0   0   0   0   0   1  ||   1   1   1   1   1   1   0

Round 26:
  0   0   0   0   0   0   0  ||   0   0   0   0   0   0   0
  0   0   0   0   0   0   0  ||   0   0   0   0   0   0   0
 [0]  0   0   0   0   0   0  ||  [1]  1   1   1   1   0   0
  1   0   0   1   0   0   0  ||   0   1   1   0   1   1   1
  0   0   0   0   0   0   1  ||   1   1   1   1   1   1   0

Round 27:
  0   0   0   0   0   0   0  ||   0   0   0   0   0   0   0
  0   0   0   0   0   0   0  ||   0   0   0   0   0   0   0
  0   0  [0]  0   0   0   0  ||   0   0  [1]  1   1   0   0
  0   0   0   1   0   0   0  ||   0   0   1   0   1   1   1
  0   0   0   0   0   0   1  ||   0   0   1   1   1   1   0

Round 28:
  0   0   0   0   0   0   0  ||   0   0   0   0   0   0   0
  0   0   0   0   0   0   0  ||   0   0   0   0   0   0   0
  0   0   0   0   0   0   0  ||   0   0   0   0   0   0   0
  0   0   0   0   0  [0]  0  ||   0   0   0   0   0  [1]  1
  0   0   0   0   0   0   1  ||   0   0   0   0   0   1   0

Done in 28 rounds

1

এটি গভীরতার ও (3 ^ (n)) গাছ ব্যবহার করে সমাধান করা যেতে পারে। যেখানে n হল সমস্ত স্কোয়ারের যোগফল।

প্রথমে বিবেচনা করুন যে হে গাছ (9 ^ n) এর সাথে সমস্যাটি সমাধান করা তুচ্ছ, কেবল সম্ভাব্য বোমা ফেলার সমস্ত স্থান বিবেচনা করুন। উদাহরণস্বরূপ আলফের বাস্তবায়ন দেখুন

পরবর্তী উপলব্ধি করুন যে আমরা নীচে থেকে বোমা তৈরির কাজ করতে পারি এবং এখনও একটি ন্যূনতম বোমা বোমাবার ধরণটি পেতে পারি।

  1. নীচে বাম কোণ থেকে শুরু করুন।
  2. এটি একমাত্র নাটক যা বোধগম্য হয় তা দিয়ে বিস্মৃত হতে পারে (উপরে এবং ডানে)।
  3. এক স্কোয়ার ডানদিকে সরান।
  4. লক্ষ্যটির শূন্যের চেয়ে বেশি মূল্য থাকা সত্ত্বেও, 2 টি নাটকের প্রত্যেকটিকে বিবেচনা করুন (সরাসরি বা উপরে এবং ডান দিকে), লক্ষ্য দ্বারা একটি করে মূল্য হ্রাস করুন এবং প্রতিটি সম্ভাবনার জন্য একটি নতুন শাখা তৈরি করুন।
  5. অন্যকে ডান দিকে সরান।
  6. লক্ষ্যটির শূন্যের চেয়েও বেশি মূল্য থাকা সত্ত্বেও, 3 টি নাটকের প্রতিটি বিবেচনা করুন (বাম, উপরে এবং ডানদিক উপরে), লক্ষ্যগুলির মান একে একে হ্রাস করুন এবং প্রতিটি সম্ভাবনার জন্য একটি নতুন শাখা তৈরি করুন।
  7. সারিটি অপসারণ না হওয়া পর্যন্ত 5 এবং 6 ধাপ পুনরাবৃত্তি করুন।
  8. একটি সারি উপরে সরান এবং ধাঁধাটি সমাধান না হওয়া পর্যন্ত 1 থেকে 7 ধাপ পুনরাবৃত্তি করুন।

এই অ্যালগরিদম কারণ সঠিক

  1. প্রতিটি সারিটি যে কোনও সময় শেষ করা প্রয়োজন।
  2. সারিটি সম্পূর্ণ করতে সর্বদা উপরের একটি, নীচের অংশে বা সেই সারির মধ্যে একটি নাটক প্রয়োজন।
  3. সারি বা সারিটির নীচে থাকা খেলার চেয়ে সর্বনিম্ন অস্পষ্ট সারির উপরে একটি প্লে বাছাই করা সর্বদা ভাল বা ভাল।

অনুশীলনে এই অ্যালগরিদম নিয়মিতভাবে এর তাত্ত্বিক সর্বাধিকের চেয়ে ভাল করবে কারণ এটি নিয়মিত প্রতিবেশীদের বোমা ফাটিয়ে দেবে এবং অনুসন্ধানের আকার হ্রাস করবে। যদি আমরা ধরে নিই যে প্রতিটি বোমাবর্ষণ 4 টি অতিরিক্ত টার্গেটের মান হ্রাস করে, তবে আমাদের অ্যালগরিদম হে (3 ^ (এন / 4)) বা আনুমানিক ও (1.3 ^ n) এ চলবে।

এই অ্যালগরিদমটি এখনও তাত্পর্যপূর্ণ তাই অনুসন্ধানের গভীরতা সীমাবদ্ধ করা বুদ্ধিমানের কাজ হবে। আমরা কয়েকটি সংখ্যায় অনুমোদিত শাখাগুলির সংখ্যা সীমাবদ্ধ করতে পারি, এক্স এবং একবার আমরা গভীর হয়ে গেলে আমরা এখন পর্যন্ত চিহ্নিত অ্যালগরিদমকে এটি নির্ধারিত সেরা পথটি বেছে নিতে বাধ্য করি (যার মধ্যে একটিতে নূন্যতম মোট বোর্ডের যোগফল রয়েছে তার এক টার্মিনাল পাতায়) )। তারপরে আমাদের অ্যালগরিদমটি ও (3 ^ এক্স) সময়ে চালানোর গ্যারান্টিযুক্ত তবে সঠিক উত্তর পাওয়ার নিশ্চয়তা নেই। তবে বর্ধিত গণনা এবং ভাল উত্তরের মধ্যে বাণিজ্য বন্ধ রাখলে আমরা সর্বদা এক্স বৃদ্ধি করতে পারি এবং পরীক্ষামূলকভাবে পরীক্ষা করতে পারি।


1

মূল্যায়ন ফাংশন, মোট যোগফল:

int f (int ** matrix, int width, int height, int x, int y)
{
    int m[3][3] = { 0 };

    m[1][1] = matrix[x][y];
    if (x > 0) m[0][1] = matrix[x-1][y];
    if (x < width-1) m[2][1] = matrix[x+1][y];

    if (y > 0)
    {
        m[1][0] = matrix[x][y-1];
        if (x > 0) m[0][0] = matrix[x-1][y-1];
        if (x < width-1) m[2][0] = matrix[x+1][y-1];
    }

    if (y < height-1)
    {
        m[1][2] = matrix[x][y+1];
        if (x > 0) m[0][2] = matrix[x-1][y+1];
        if (x < width-1) m[2][2] = matrix[x+1][y+1];
    }

    return m[0][0]+m[0][1]+m[0][2]+m[1][0]+m[1][1]+m[1][2]+m[2][0]+m[2][1]+m[2][2];
}

উদ্দেশ্য ফাংশন:

Point bestState (int ** matrix, int width, int height)
{
    Point p = new Point(0,0);
    int bestScore = 0;
    int b = 0;

    for (int i=0; i<width; i++)
        for (int j=0; j<height; j++)
        {
            b = f(matrix,width,height,i,j);

            if (b > bestScore)
            {
                bestScore = best;
                p = new Point(i,j);
            }
        }

    retunr p;
}

ফাংশন ধ্বংস:

void destroy (int ** matrix, int width, int height, Point p)
{
    int x = p.x;
    int y = p.y;

    if(matrix[x][y] > 0) matrix[x][y]--;
    if (x > 0) if(matrix[x-1][y] > 0) matrix[x-1][y]--;
    if (x < width-1) if(matrix[x+1][y] > 0) matrix[x+1][y]--;

    if (y > 0)
    {
        if(matrix[x][y-1] > 0) matrix[x][y-1]--;
        if (x > 0) if(matrix[x-1][y-1] > 0) matrix[x-1][y-1]--;
        if (x < width-1) if(matrix[x+1][y-1] > 0) matrix[x+1][y-1]--;
    }

    if (y < height-1)
    {
        if(matrix[x][y] > 0) matrix[x][y+1]--;
        if (x > 0) if(matrix[x-1][y+1] > 0) matrix[x-1][y+1]--;
        if (x < width-1) if(matrix[x+1][y+1] > 0) matrix[x+1][y+1]--;
    }
}

লক্ষ্য ফাংশন:

bool isGoal (int ** matrix, int width, int height)
{
    for (int i=0; i<width; i++)
        for (int j=0; j<height; j++)
            if (matrix[i][j] > 0)
                return false;
    return true;
}

লিনিয়ার সর্বাধিককরণ কার্য:

void solve (int ** matrix, int width, int height)
{
    while (!isGoal(matrix,width,height))
    {
        destroy(matrix,width,height, bestState(matrix,width,height));
    }
}

এটি সর্বোত্তম নয়, তবে একটি আরও ভাল মূল্যায়ন ফাংশন সন্ধানের মাধ্যমে অনুকূলিত করা যেতে পারে ..

.. তবে এই সমস্যাটি নিয়ে ভাবছিলাম, আমি ভাবছিলাম যে মূল বিষয়গুলির মধ্যে একটি হ'ল কোনও এক সময় শূন্যদের মাঝখানে পরিত্যক্ত পরিসংখ্যান পাচ্ছে, তাই আমি আরও একটি পদ্ধতি গ্রহণ করব .. যা নূন্যতম মানগুলিকে শূন্যে আধিপত্য করবে, তারপরে চেষ্টা করুন যতটা সম্ভব শূণ্যগুলি অব্যাহত রাখে, যা সর্বনিম্ন বিদ্যমান মান (গুলি) বা হ্রাস করতে পারে


0

এই সমস্ত সমস্যাটি এটিকে ফুটিয়ে তোলে একটি সম্পাদনা দূরত্বের গণনা করা। কেবলমাত্র প্রদত্ত ম্যাট্রিক্স এবং শূন্য ম্যাট্রিক্সের মধ্যে লেভেনস্টেইন দূরত্বের একটি বৈকল্পিক গণনা করুন, যেখানে সম্পাদনগুলি বোমা ফাটানো দ্বারা প্রতিস্থাপন করা হয়, মধ্যবর্তী অ্যারেগুলির মধ্যে দূরত্বগুলি সঞ্চয় করতে গতিশীল প্রোগ্রামিং ব্যবহার করে। আমি ম্যাট্রিকের একটি হ্যাশকে কী হিসাবে ব্যবহার করার পরামর্শ দিই। সিউডো-পাইথনে:

memo = {}

def bomb(matrix,i,j):
    # bomb matrix at i,j

def bombsRequired(matrix,i,j):
    # bombs required to zero matrix[i,j]

def distance(m1, i, len1, m2, j, len2):
    key = hash(m1)
    if memo[key] != None: 
        return memo[key]

    if len1 == 0: return len2
    if len2 == 0: return len1

    cost = 0
    if m1 != m2: cost = m1[i,j]
    m = bomb(m1,i,j)
    dist = distance(str1,i+1,len1-1,str2,j+1,len2-1)+cost)
    memo[key] = dist
    return dist

0

এটি প্রথম জিজ্ঞাসিত প্রশ্নের উত্তর ছিল। আমি লক্ষ্য করিনি যে সে প্যারামিটারগুলি পরিবর্তন করেছে।

সমস্ত লক্ষ্যমাত্রার একটি তালিকা তৈরি করুন। একটি ড্রপ দ্বারা প্রভাবিত ইতিবাচক মানগুলির সংখ্যার ভিত্তিতে লক্ষ্যকে একটি মান নির্ধারণ করুন (নিজে এবং সমস্ত প্রতিবেশী)। সর্বোচ্চ মান একটি নয় হবে।

প্রভাবিত টার্গেটের সংখ্যা (উতরোত্তর) অনুসারে লক্ষ্যবস্তুগুলিকে বাছাই করুন, প্রতিটি প্রভাবিত টার্গেটের যোগফলের সেকেন্ডারি অবতরণ সাজানোর মাধ্যমে।

সর্বোচ্চ র‌্যাঙ্কড লক্ষ্যবস্তুতে একটি বোমা ফেলুন, তারপরে লক্ষ্যগুলি পুনরায় গণনা করুন এবং সমস্ত লক্ষ্য মান শূন্য না হওয়া পর্যন্ত পুনরাবৃত্তি করুন।

সম্মত, এটি সর্বদা সর্বোত্তম নয় op উদাহরণ স্বরূপ,

100011
011100
011100
011100
000000
100011

এই পদ্ধতিটি পরিষ্কার করতে 5 টি বোমা লাগবে। সর্বোত্তমভাবে, যদিও আপনি এটি 4 এ করতে পারতেন, তবুও, খুব সুন্দর রঞ্জক বন্ধ রয়েছে এবং কোনও ব্যাকট্র্যাকিং নেই। বেশিরভাগ পরিস্থিতিতে এটি সর্বোত্তম বা খুব কাছাকাছি থাকবে।

মূল সমস্যা নম্বর ব্যবহার করে, এই পদ্ধতির 28 টি বোমা সলভ করে।

এই পদ্ধতিটি প্রদর্শনের জন্য কোড যুক্ত করা (একটি বোতাম সহ কোনও ফর্ম ব্যবহার করে):

         private void button1_Click(object sender, EventArgs e)
    {
        int[,] matrix = new int[10, 10] {{5, 20, 7, 1, 9, 8, 19, 16, 11, 3}, 
                                         {17, 8, 15, 17, 12, 4, 5, 16, 8, 18},
                                         { 4, 19, 12, 11, 9, 7, 4, 15, 14, 6},
                                         { 17, 20, 4, 9, 19, 8, 17, 2, 10, 8},
                                         { 3, 9, 10, 13, 8, 9, 12, 12, 6, 18}, 
                                         {16, 16, 2, 10, 7, 12, 17, 11, 4, 15},
                                         { 11, 1, 15, 1, 5, 11, 3, 12, 8, 3},
                                         { 7, 11, 16, 19, 17, 11, 20, 2, 5, 19},
                                         { 5, 18, 2, 17, 7, 14, 19, 11, 1, 6},
                                         { 13, 20, 8, 4, 15, 10, 19, 5, 11, 12}};


        int value = 0;
        List<Target> Targets = GetTargets(matrix);
        while (Targets.Count > 0)
        {
            BombTarget(ref matrix, Targets[0]);
            value += 1;
            Targets = GetTargets(matrix);
        }
        Console.WriteLine( value);
        MessageBox.Show("done: " + value);
    }

    private static void BombTarget(ref int[,] matrix, Target t)
    {
        for (int a = t.x - 1; a <= t.x + 1; a++)
        {
            for (int b = t.y - 1; b <= t.y + 1; b++)
            {
                if (a >= 0 && a <= matrix.GetUpperBound(0))
                {
                    if (b >= 0 && b <= matrix.GetUpperBound(1))
                    {
                        if (matrix[a, b] > 0)
                        {
                            matrix[a, b] -= 1;
                        }
                    }
                }
            }
        }
        Console.WriteLine("Dropped bomb on " + t.x + "," + t.y);
    }

    private static List<Target> GetTargets(int[,] matrix)
    {
        List<Target> Targets = new List<Target>();
        int width = matrix.GetUpperBound(0);
        int height = matrix.GetUpperBound(1);
        for (int x = 0; x <= width; x++)
        {
            for (int y = 0; y <= height; y++)
            {
                Target t = new Target();
                t.x = x;
                t.y = y;
                SetTargetValue(matrix, ref t);
                if (t.value > 0) Targets.Add(t);
            }
        }
        Targets = Targets.OrderByDescending(x => x.value).ThenByDescending( x => x.sum).ToList();
        return Targets;
    }

    private static void SetTargetValue(int[,] matrix, ref Target t)
    {
        for (int a = t.x - 1; a <= t.x + 1; a++)
        {
            for (int b = t.y - 1; b <= t.y + 1; b++)
            {
                if (a >= 0 && a <= matrix.GetUpperBound(0))
                {
                    if (b >= 0 && b <= matrix.GetUpperBound(1))
                    {
                        if (matrix[ a, b] > 0)
                        {
                            t.value += 1;
                            t.sum += matrix[a,b];
                        }

                    }
                }
            }
        }

    }

আপনার প্রয়োজন এমন একটি ক্লাস:

        class Target
    {
        public int value;
        public int sum;
        public int x;
        public int y;
    }

1
অনুকূল নয়। জবাবদিহি উদাহরণ: 09090এই পদ্ধতির 18 টি বোমা দরকার। এটি 9
রহস্যময়

@ মিস্টিয়াল আপনি উত্তরটি ভাল করে পড়েন নি। যেহেতু এটি অ-শূন্য ক্ষেত্রের প্রভাবের সংখ্যার উপর ভিত্তি করে, এই অ্যালগরিদমটি মাঝের শূন্যকে বোমাবে এবং এটি 9 টি ফোঁটাতে সম্পন্ন হবে। 9 এর উচ্চ মান হ'ল আট জন প্রতিবেশী এবং নিজেই রয়েছে।
অ্যান্টনি কুইন

তারপর কিভাবে সম্পর্কে 1010101, 0010100?
রহস্যময়

@ মিস্টিয়াল প্রথম, প্রথম শূন্যের জন্য, তারপরে শেষ শূন্য হিট হবে। এটা দুই ফোঁটা হবে। এর কারণ এটি প্রতিবার বোমা ফেললে এটি পরের সেরা লক্ষ্যটিকে পুনরায় গণনা করে। শেষ উদাহরণের জন্য, আবার মাঝের শূন্য; এক বিন্দু.
অ্যান্টনি কুইন

1
@ অ্যান্টনিউইউন: এটি কার্যকর হয় না। অনুগ্রহ করে আমার প্রতিবেদনের জন্য chat.stackoverflow.com/transcript/message/8224273#8224273 দেখুন ।
nneonneo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.