एक माइनस्वीपर बोर्ड के 3BV की गणना करें


17

3BV एक की माइनस्वीपर बोर्ड बोर्ड को हल करना है, तो आप पहले से ही समाधान पता आवश्यक बाईं क्लिक की न्यूनतम संख्या का प्रतिनिधित्व करता है। यह "बीचटेल के बोर्ड बेंचमार्क मूल्य" के लिए है। यहां उनकी साइट बता रही है।

नीचे एक हल किया हुआ माइनस्वीपर बोर्ड है। झंडे खानों को इंगित करते हैं; खानों के बिना टाइलें आसन्न खानों की गिनती को तिरछे सहित दर्शाती हैं, सिवाय इसके कि जिन टाइलों में "0" होना चाहिए वे बजाय खाली रह जाती हैं। छवि से पता चलता है कि बोर्ड को हल करने के लिए किन टाइलों पर क्लिक करना होगा।

3BV की गिनती

3BV की ओर गिने जाने वाले क्लिक हैं:

  • रिक्त टाइलों के प्रत्येक बाढ़ से भरे क्षेत्र के लिए एक (शून्य समीप की खदानें) और उनके गैर-खाली पड़ोसी।
  • एक दूसरे के लिए गैर-खदान टाइल।

एक और उदाहरण (3BV = 39)

सॉल्व्ड माइनस्वीपर बोर्ड आवश्यक क्लिक


मूल्यों के 2 डी सरणी को देखते हुए, 0स्पष्ट और 1एक खदान (या बूलियन) के लिए, 3BV लौटें

एक बोर्ड का आयाम कम से कम 8x8 और अधिकतम 24x30 होगा। आपके कार्यक्रम को सभी संभव बोर्डों को संभालना चाहिए, न कि केवल उदाहरणों को।

नोट: एक बोर्ड में कभी भी केवल खदानें नहीं होंगी।

उदाहरण I / O:

[[0,0,0,0,0,0,0,0],
[0,0,0,1,0,0,0,0],
[0,0,0,1,0,0,1,0],
[0,1,0,0,1,0,0,0],
[0,0,1,0,0,0,0,1],
[0,0,0,1,0,0,0,0],
[0,0,0,0,0,0,1,0],
[0,0,0,0,0,0,0,1]]

23

[[0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0],
[0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0],
[0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,1,0,0,0,1,0,1,0,1,0],
[0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0],
[0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,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,0,1,0,1,0,0,1,1,0,1],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1],
[0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0],
[0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0],
[1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1],
[0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,1,0,0,0,0,1,1,0,0],
[0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,0,0,1,1,0,0],
[0,1,1,1,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0],
[0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0],
[0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0]]

187

इनपुट के रूप में पूर्णांकों की एक सरणी ठीक है? प्रत्येक पूर्णांक एक पंक्ति को कोड करता है।
कार्ल नेफ

@KarlNapf सं। इनपुट को बोर्ड के रूप में पहचाना जाना चाहिए जैसा कि दिखाया गया है।
mbomb007

क्या आप अधिक परीक्षण मामले प्रदान कर सकते हैं, संभवतः प्रदर्शित छवियों के आधार पर इनपुट सहित, और शायद एक अधिकतम आयाम परीक्षण मामला?
मील

जवाबों:


15

MATLAB, 92 90 86 83 79 74 72 बाइट्स

x=input('');I=@(x)~imdilate(x,ones(3));[C,N]=bwlabel(I(x));nnz(I(C)-x)+N

यह समाधान 0 और 1 के 2 डी मैट्रिक्स के रूप में इनपुट को स्वीकार करता है और प्रदान किए गए इनपुट के लिए 3BV मान प्रदर्शित करेगा।

यहाँ आप MATLAB के बिना उन लोगों के लिए ऑक्टेव में थोड़ा संशोधित डेमो है।

व्याख्या

इनपुट मैट्रिक्स 3 x 3 मैट्रिक्स के 1एस का उपयोग करके पतला होता है और फिर उलटा (उपयोग करके ~) जो उन सभी बिंदुओं की पहचान करता है जिनमें पड़ोसी ( 1) या ( ) के रूप में माइंस नहीं होते हैं 0। जुड़े क्षेत्रों की संख्या निर्धारित करने के लिए, हम bwlabelप्रत्येक जुड़े क्षेत्र को लेबल करने के लिए उपयोग करते हैं 1। पहला आउटपुट लेबल मैट्रिक्स है ( 0जहां इनपुट शून्य था और रेंज में कोई भी मूल्य 1...Nजहां 1इनपुट में था , जहां Nकनेक्टेड समूह का सूचकांक है जो यह है)। दूसरा आउटपुट क्षेत्रों की संख्या है (उन्हें खोलने के लिए आवश्यक क्लिक की संख्या)। के परिणाम bwlabelको बाईं ओर की छवि में दिखाया गया है।

यहाँ छवि विवरण दर्ज करें

हम bwlabelउपयोग के पहले आउटपुट का विस्तार करते हैं imdilate(सभी गैर-शून्य का विस्तार किया जाता है) 3 x 3 मैट्रिक्स का उपयोग करके 1। परिणाम बीच में छवि में दिखाया गया है।

शेष क्लिकों को निर्धारित करने के लिए, हम फिर उन वर्गों की गणना करते हैं जो इस विस्तारित क्षेत्र में नहीं हैं ( ~imdilate()) और एक खदान ( -x) नहीं है (दाईं ओर की छवि में सफेद वर्ग) और इसे खुले क्षेत्रों की कुल संख्या में जोड़ें (शेष संख्या 3BV पाने के लिए बाईं ओर की छवि में अलग-अलग रंग)।


9

सप्टक, 86 84 79 66 बाइट्स

@(x)nnz(~imdilate(c=imerode(~x,o=ones(3)),o)-x)+max(bwlabel(c)(:))

यह समाधान एक अनाम फ़ंक्शन बनाता है ansजिसे नाम दिया गया है और फिर इसे 0's 1' और 's ' के 2D मैट्रिक्स से पास किया जा सकता है । तर्क मेरे MATLAB के उत्तर के समान है लेकिन कुछ ट्रिक्स का उपयोग करता है जो ऑक्टेव को अंतरिक्ष को बचाने के लिए पेश करना है।

इस समाधान के लिए आवश्यक है कि imageपैकेज स्थापित हो।

यहां डेमो करें


2

MATL, 24 22 21 बाइट्स (गैर-प्रतिस्पर्धात्मक)

1 बाईट ने @Luis को धन्यवाद दिया

4Y6Z+~l2#ZIw7MZ+G+~z+

इसे MATL ऑनलाइन पर आज़माएं

व्याख्या

फिर, यह मेरे MATLAB और ऑक्टेव के समान है जो इस प्रश्न का उत्तर देता है।

        % Implicitly grab input array
4Y6     % Push the literal [1 1 1; 1 1 1; 1 1 1] to the stack
Z+      % Perform 2D convolution of the input with this array
~       % Negate the result
l2#ZI   % Call bwlabeln which dilates each open region and the second output
        % returns the number of open regions
w       % Flip the top two stack elements
7M      % Push the literal [1 1 1; 1 1 1; 1 1 1] to the stack again
Z+      % Perform 2D convolution
G+      % Explicitly grab the input and add it to the result
~z      % Count the number of 0's in the result (the remaining number of clicks)
+       % Add the total number of remaining clicks to the number of open regions 

गैरकानूनी क्यों?
कैलक्यूलेटरफिलीन

1
@CalculatorFeline दुर्भाग्य से चुनौती पोस्ट होने के बादbwlabeln MATL को पेश किया गया था।
स्वेवर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.