দাবা প্রোগ্রাম বিকাশ করার সময় প্রদত্ত মানগুলির সাথে নীচে দিকনির্দেশের অ্যারেগুলি শুরু করার তাত্পর্যটি কী?


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]আমাকে চারটি মূল নির্দেশিকা দেয়।
ড্যাসব্লিংকনলাইট

14
এটি একটি আশ্চর্যজনক ভাল প্রশ্ন। ... শিরোনাম সম্পর্কে কিছু করা যেতে পারে?
লুসার ড্রুজ

7
সুতরাং আপনি উল্লেখ করার জন্য ভাবেন নি যে এই কোডটি দাবা ইঞ্জিন থেকে এসেছে? এছাড়াও আপনি কীভাবে এই মূল্যবোধগুলি ব্যবহার করা হচ্ছে তা নিজেকে দেখার চিন্তা করেননি ?
ট্রোজানফয়ে

15
"অনেক দুর্দান্ত কোডার এই চারটি লাইন [...]" রেখেছেন - আমি এখানে নিটপিক করছি, তবে তারা দুর্দান্ত কোডার হলে তাদের কোড আপনাকে বিস্মিত করার কারণ হতে পারে না "wtf is the تعمیر ?!"
utnapistim

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

উত্তর:


84

এটি সমস্ত কৌশলকে অ্যারে হিসাবে এনকোড করার একটি কৌশল - প্রতিটি জুড়ি di[i],dj[i]একটি আলাদা দিক।

যদি আমরা কল্পনা করি যে কোনও স্থান x, y এ আমাদের একটি টুকরা রয়েছে এবং আমরা এটির কাছাকাছি অবস্থানে স্থানান্তর করতে এর x এবং এর y মানটি যোগ করতে চাই, 1,0 পূর্ব, -1,0 পশ্চিমে, 0,1 দক্ষিণে, 0, -1 উত্তর এবং আরও

(এখানে আমি বলেছি উপরের বামটি 0,0 এবং নীচের ডানটি 4,4 এবং অ্যারেগুলির প্রতিটি সূচকটি কেন্দ্রীয় পয়েন্ট, এক্স, ২,২ থেকে কী করবে তা দেখিয়েছে))

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

এটি যেভাবে সেট আপ করা হয়েছে, যদি আপনি সূচকে ^1( ^বিটওয়াইজ এক্সওআর হয়ে) থাকেন তবে আপনি বিপরীত দিকটি পান - 0 এবং 1 টি বিপরীত, 2 এবং 3 বিপরীত এবং এই জাতীয়। (এটি সেট আপ করার আরেকটি উপায় হ'ল উত্তর থেকে শুরু করে ঘড়ির কাঁটার দিকে এগিয়ে যাওয়া - তারপরে ^4আপনাকে বিপরীত দিকে দিকে নিয়ে যায়))

এখন আপনি একটি নির্দিষ্ট বিন্দু থেকে আপনার diএবং djঅ্যারেগুলি লুপ করে সমস্ত দিকনির্দেশ পরীক্ষা করতে পারেন , পরিবর্তে প্রতিটি দিকটি তার নিজের লাইনে লিখতে হবে (মোট আটজনের জন্য!) (সীমা পরীক্ষা করতে ভুলবেন না :))

diKএবং djKসকল ফর্ম নাইটদের দিকনির্দেশ সব সংলগ্ন দিকনির্দেশ পরিবর্তে। এখানে, ^1একটি অক্ষ বরাবর উল্টানো ^4হবে, বিপরীত নাইট লিপ দিতে হবে।

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

3
'নাইট দিকনির্দেশ' কি?
ডেভিড

4
ওহ, এ জাতীয় নাইট।
ডেভিড

1
আপনার উত্তরের জন্য আপনাকে অনেক ধন্যবাদ .. আপনি কি দয়া করে আমাকে লিঙ্ক করতে পারেন বা এটির আরও ভাল উদাহরণ সহ্য করার জন্য আমাকে কিছু কোড দেখাতে পারেন .. (আমি যদি কিছুটা নবজাতক .. আপনি যদি বুঝতে পারতেন :) আবারও ধন্যবাদ
এজাজিরেক্স

1
আমি উত্তরে পাতাসুর প্রচেষ্টাকে সাধুবাদ জানাই। যদিও মনে হয় অনেকেই তাঁর ব্যাখ্যা বুঝতে পেরেছেন, আমি এটি ভাল করে বুঝতে পারি না। ইতিমধ্যে যা বলা হয়েছে তাতে যদি কেউ যুক্ত করতে পারে তবে আমি খুব কৃতজ্ঞ হব।
দীপক

1
@ প্রদীপ কল্পনা করুন কোনও অবস্থান x,y2D স্পেসে একটি টিপল দ্বারা প্রতিনিধিত্ব করা হয়েছে। প্রতিটি জোড়ার জন্য di[i], dj[i]এটি যুক্ত করুন x,yএবং আপনি x,yএকে একে প্রতিটি দিকে ট্রান্সপোস্ট হয়ে যাবেন । যে জানার জন্য?
পাতাসু

64

যারা পাতাসুর ব্যাখ্যা অনুসরণ করতে অসুবিধে হয়েছে তাদের জন্য, আমি স্পষ্ট করার চেষ্টা করব।

কল্পনা করুন যে আপনি দাবা বোর্ডের প্রদত্ত বিন্দু থেকে প্রতিটি সম্ভাব্য পদক্ষেপ বিবেচনা করার চেষ্টা করছেন।

যদি আপনি ডিআই এবং ডিজে অ্যারেগুলি লুপ করেন, ডি মানগুলিকে এক্স অফসেট এবং ডিজে মানগুলি y অফসেট হিসাবে ব্যাখ্যা করেন তবে আপনি সম্ভাব্য 8 টি দিকের প্রতিটিটি কভার করেন।

ধনাত্মক x অনুমান করা হয় পূর্ব এবং ধনাত্মক 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 | দক্ষিণ-পশ্চিম

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

  | ডি কে / এক্স | ডিজেকে / ওয়াই | অভিমুখ
- + + ------- + + ------- + + ----------------
0 | -২ | -1 | 2 পশ্চিম, 1 উত্তর
1 | -২ | 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 | -২ | 1 পূর্ব, 2 উত্তর
7 | -1 | -২ | 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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.