शतरंज कार्यक्रम विकसित करते समय दिए गए मूल्यों के साथ नीचे दिशा सरणियों को आरम्भ करने का क्या महत्व है?


106

मैं प्रतिस्पर्धी प्रोग्रामिंग के लिए नया हूं, और मैंने अक्सर देखा, कई महान कोडर्स के पास अपने कोड में ये चार लाइनें हैं (विशेषकर गिरफ्तारी वाले लोगों में):

int di[] = { 1, -1, 0, 0, 1, -1, 1, -1 };
int dj[] = { 0, 0, 1, -1, 1, -1, -1, 1 };
int diK[] = { -2, -2, -1, 1, 2, 2, 1, -1 };
int djK[] = { -1, 1, 2, 2, 1, -1, -2, -2 };

यह वास्तव में क्या दर्शाता है और तकनीक का उपयोग किस लिए किया जाता है?


5
मैं अक्सर इसके लिए उपयोग करता हूं d={0,1,0,-1,0}: d[i], d[i+1]मुझे चार कार्डिनल निर्देश देने के लिए आइटम जोड़े ।
dasblinkenlight

14
यह आश्चर्यजनक रूप से अच्छा सवाल है। ... शीर्षक के बारे में कुछ किया जा सकता है?
लूसर

7
इसलिए आपने यह उल्लेख करना उचित नहीं समझा कि यह कोड शतरंज इंजन से आता है? इसके अलावा, आपने खुद नहीं देखा कि ये मूल्य कैसे इस्तेमाल किए जा रहे थे?
ट्रोजनफो

15
"कई महान कोडर्स में ये चार लाइनें हैं [...]" - मैं यहाँ नाइटपैकिंग कर रहा हूँ, लेकिन अगर वे महान कोडर थे, तो उनका कोड आपको आश्चर्यचकित नहीं करेगा "wtf वह निर्माण है ?!"
utnapistim

6
@utnapistim कोड के विशाल बहुमत को लिखते समय, आप सही हैं, लेकिन यहां, आप बिंदु को याद कर रहे हैं। यह मामला उस नियम का एक वैध अपवाद है। यदि आप एक प्रतियोगिता के लिए और एक समय की कमी के तहत कोड लिख रहे हैं, तो क्विक-एंड-डेंट लगभग हमेशा साफ-और-रखरखाव योग्य से बेहतर होता है। इस मामले में आप के लिए पठनीय, अब वास्तव में यह सब मायने रखता है। एक महान कोडर बहुत अच्छी तरह से इस संदर्भ में एक अप्राप्य अपठनीय गड़बड़ लिखता है , भले ही उनके अधिकांश नियमित कोड अत्यधिक पठनीय और बनाए रखने योग्य हों।
बेन ली

जवाबों:


84

यह सभी दिशाओं को सरणियों के रूप में एन्कोड करने की एक तकनीक है - प्रत्येक जोड़ी di[i],dj[i]एक अलग दिशा है।

यदि हम कल्पना करते हैं कि हमारे पास एक स्थान x, y पर एक टुकड़ा है, और हम इसके x और इसके y मान को इसे पास के स्थान पर ले जाना चाहते हैं, तो 1,0 पूर्व, -1,0 पश्चिम, 0,1 है। दक्षिण है, 0, -1 उत्तर की और है।

(यहां मैंने कहा है कि ऊपर बाईं ओर 0,0 है और नीचे दाएं 4,4 है और दिखाया गया है कि सरणियों के प्रत्येक सूचकांक को केंद्रीय बिंदु, X से 2,2 पर क्या बनाया जाएगा।)

.....
.536.
.1X0.
.724.
.....

जिस तरह से इसे सेट किया गया है, यदि आप इंडेक्स पर बिटवाइड ^1( ^XOR) होने पर आपको विपरीत दिशा मिलती है - 0 और 1 विपरीत हैं, 2 और 3 विपरीत हैं और इसी तरह। (इसे स्थापित करने का एक और तरीका उत्तर में शुरू होने वाली घड़ी की दिशा में जाना है - फिर ^4आपको विपरीत दिशा मिलती है।)

अब आप किसी दिए गए बिंदु से सभी दिशाओं का परीक्षण अपने diऔर djसरणियों पर लूपिंग करके कर सकते हैं, बजाय इसके कि प्रत्येक दिशा को अपनी लाइन पर लिखने की जरूरत है (कुल मिलाकर आठ के लिए!) (बस सीमा जाँच करना न भूलें :))

diKऔर सभी समीपवर्ती दिशाओं के बजाय djKसभी शूरवीरों को दिशा दें। यहां, ^1एक अक्ष के साथ फ्लिप ^4करेगा, विपरीत नाइट लीप देगा।

.7.6.
0...5
..K..
1...4
.2.3.

3
'शूरवीर दिशा-निर्देश' क्या हैं?
डेविड

4
ओह, इस तरह की नाइट।
डेविड

1
आपके उत्तर के लिए बहुत बहुत धन्यवाद .. क्या आप मुझे लिंक कर सकते हैं या शायद इसे बेहतर रूप से बताने के लिए मुझे कुछ कोड दिखा सकते हैं .. (मैं थोड़ा नौसिखिया हूं .. अगर आप समझ सकते हैं :) धन्यवाद फिर से
ejjyrex

1
मैं एक उत्तर में पतसू के प्रयास की सराहना करता हूं। जबकि ऐसा लगता है कि कई लोग उसके स्पष्टीकरण को समझ चुके हैं, मैं इसे अच्छी तरह से समझ नहीं पा रहा हूं। अगर कोई भी पहले से ही कहा गया है जोड़ सकते हैं, मैं बहुत आभारी होंगे।
दीपक

1
@deepak यह कल्पना करें कि कोई स्थान x,y2D स्थान में टपल द्वारा दर्शाया गया है। di[i], dj[i]इसे जोड़ने के लिए प्रत्येक जोड़ी के लिए x,yऔर आप x,yएक-एक करके प्रत्येक दिशा में ट्रांसपोज़ हो जाएंगे । क्या इसका कोई मतलब है?
पाटशू

64

पातशू के स्पष्टीकरण का अनुसरण करने वालों के लिए, मैं स्पष्ट करने का प्रयास करूँगा।

कल्पना कीजिए कि आप एक शतरंज बोर्ड पर दिए गए बिंदु से हर संभव कदम पर विचार करने की कोशिश कर रहे हैं।

यदि आप di और dj सरणियों पर लूप करते हैं, तो x मानों के रूप में di मानों की व्याख्या और y ऑफ़सेट्स के रूप में dj मानों, आप प्रत्येक संभावित 8 दिशाओं को कवर करते हैं।

सकारात्मक एक्स को पूर्व और पॉजिटिव y को दक्षिण मान लें (जैसा कि पटाशू के उत्तर में है), आपको निम्नलिखित मिलते हैं;

  | di / x | dj / y | दिशा
- + ------ + ------ + -----------
0 | 1 | 0 | पूर्व
1 | -1 | 0 | पश्चिम
2 | 0 | 1 | दक्षिण
3 | 0 | -1 | उत्तर
4 | 1 | 1 | दक्षिण-पूर्व
5 | -1 | -1 | उत्तर पश्चिम
6 | 1 | -1 | ईशान कोण
7 | -1 | 1 | दक्षिण पश्चिम

डीआईके और डीजेके सरणियों को उसी तरह से व्याख्या किया जा सकता है जो नाइट टुकड़ा के लिए संभावित चालें स्थापित करने के लिए है। यदि आप शतरंज से परिचित नहीं हैं, तो नाइट एक एल पैटर्न में चलती है - एक दिशा में दो वर्ग, और फिर एक वर्ग को समकोण पर (या इसके विपरीत)।

  | diK / x | djK / y | दिशा
- + ------- + ------- + ----------------
0 | -2 | -1 | 2 पश्चिम, 1 उत्तर
1 | -2 | 1 | 2 पश्चिम, 1 दक्षिण
2 | -1 | 2 | 1 पश्चिम, 2 दक्षिण
3 | 1 | 2 | 1 पूर्व, 2 दक्षिण
4 | 2 | 1 | 2 पूर्व, 1 दक्षिण
5 | 2 | -1 | 2 पूर्व, 1 उत्तर
6 | 1 | -2 | 1 पूर्व, 2 उत्तर
7 | -1 | -2 | 1 पश्चिम, 2 उत्तर

1

सभी दिशाओं में संभव चाल की मात्रा की जांच करने के लिए कोड का एक छोटा सा टुकड़ा, जो परिभाषित सरणियों का उपयोग करता है।

int di[] = { 1, -1, 0, 0, 1, -1, 1, -1 };
int dj[] = { 0, 0, 1, -1, 1, -1, -1, 1 };
int movesPossible[8];
int move = 0;
int posx, posy; // position of the figure we are checking

for (int d=0; d<8; d++) {
  for (move = 1; board.getElt(posx+di[d]*move, posy+dj[d]*move)==EMPTY; move++) ;
  movesPossible[d] = move-1;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.