Beautiful Matrix সমস্যার সি++ সমাধান - বাংলা ব্যাখ্যা
এই পোস্টে আমরা "Beautiful Matrix" নামের একটি প্রোগ্রামিং সমস্যার সমাধান করবো সি++ ভাষায়। সমস্যাটির উদ্দেশ্য হলো একটি ৫×৫ ম্যাট্রিক্সে একটি "১" কে মাঝখানে (৩য় সারি, ৩য় কলাম) নিয়ে আসার জন্য সর্বনিম্ন কতগুলো মুভ লাগবে তা বের করা। প্রতিটি মুভে আমরা পাশাপাশি দুটি সারি বা কলাম অদলবদল করতে পারি। এখানে আমি আমার সমাধানের প্রতিটি লাইন বাংলায় বিস্তারিতভাবে ব্যাখ্যা করবো।
সমস্যার বিবরণ
আমাদের দেওয়া আছে একটি ৫×৫ ম্যাট্রিক্স যেখানে ২৪টি শূন্য (০) এবং একটি এক (১) আছে। আমাদের লক্ষ্য হলো এই "১" কে ম্যাট্রিক্সের মাঝখানে (৩য় সারি, ৩য় কলাম, বা ০-ভিত্তিক ইনডেক্সে ২,২) নিয়ে আসা। আমরা শুধু পাশের সারি বা কলাম অদলবদল করতে পারি।
সি++ কোড
#include <bits/stdc++.h>
using namespace std;
int main() {
const int n = 5;
vector<vector<int>> matrix(n, vector<int>(n));
int row, col;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
cin >> matrix[i][j];
if(matrix[i][j] == 1) {
row = i;
col = j;
}
}
}
int moves = abs(row - 2) + abs(col - 2);
cout << moves << endl;
return 0;
}
লাইন বাই লাইন বাংলা ব্যাখ্যা
লাইন ১: #include <bits/stdc++.h>
এই লাইনটি সি++ এর স্ট্যান্ডার্ড লাইব্রেরির সব হেডার ফাইল ইনক্লুড করে। এটি আমাদের প্রয়োজনীয় সব ফাংশন যেমন vector
, cin
, cout
, abs
ইত্যাদি ব্যবহার করতে দেয়। এটি একটি শর্টকাট যা সাধারণত প্রতিযোগিতামূলক প্রোগ্রামিংয়ে ব্যবহৃত হয়।
লাইন ২: using namespace std;
এটি আমাদের std
নেমস্পেসের সবকিছু সরাসরি ব্যবহার করার অনুমতি দেয়। যেমন, আমাদের std::cin
এর পরিবর্তে শুধু cin
লিখতে হবে।
লাইন ৪: int main() {
এটি প্রোগ্রামের মূল ফাংশন। প্রোগ্রাম শুরু হয় এখান থেকে এবং এটি একটি ইন্টিজার (পূর্ণসংখ্যা) রিটার্ন করে।
লাইন ৫: const int n = 5;
এখানে আমরা একটি ধ্রুবক (constant) ভেরিয়েবল n
ডিফাইন করছি যার মান ৫। এটি ম্যাট্রিক্সের আকার নির্দেশ করে (৫×৫)। const
মানে এটি পরিবর্তন করা যাবে না।
লাইন ৬: vector<vector<int>> matrix(n, vector<int>(n));
এটি একটি ৫×৫ ম্যাট্রিক্স তৈরি করে vector
ব্যবহার করে। vector
হলো একটি গতিশীল অ্যারে। এখানে:
vector<int>(n)
মানে ৫টি ইন্টিজারের একটি ভেক্টর (ডিফল্ট মান ০)।vector<vector<int>> matrix(n, ...)
মানে ৫টি সারির একটি ভেক্টর, যেখানে প্রতিটি সারিতে ৫টি কলাম আছে।
লাইন ৭: int row, col;
এখানে দুটি ভেরিয়েবল row
এবং col
ডিফাইন করা হয়েছে। এগুলো "১" এর বর্তমান সারি এবং কলামের ইনডেক্স সংরক্ষণ করবে।
লাইন ৮: for(int i = 0; i < n; i++) {
এটি একটি লুপ যা ০ থেকে ৪ পর্যন্ত চলে (মোট ৫ বার, কারণ n = 5
)। এটি ম্যাট্রিক্সের প্রতিটি সারির জন্য কাজ করে। i
হলো সারির ইনডেক্স।
লাইন ৯: for(int j = 0; j < n; j++) {
এটি একটি ভেতরের লুপ যা প্রতিটি সারির ৫টি কলামের জন্য চলে। j
হলো কলামের ইনডেক্স।
লাইন ১০: cin >> matrix[i][j];
এটি ব্যবহারকারীর কাছ থেকে ইনপুট নেয় এবং matrix[i][j]
পজিশনে সংরক্ষণ করে। আমরা ৫টি লাইনে ৫টি করে সংখ্যা ইনপুট দেবো।
লাইন ১১: if(matrix[i][j] == 1) {
এটি চেক করে যে বর্তমান পজিশনে (i, j
) যদি "১" থাকে।
লাইন ১২: row = i;
যদি "১" পাওয়া যায়, তাহলে row
ভেরিয়েবলে সেই সারির ইনডেক্স (i
) সেট করা হয়।
লাইন ১৩: col = j;
একইভাবে, col
ভেরিয়েবলে "১" এর কলামের ইনডেক্স (j
) সেট করা হয়।
লাইন ১৪-১৫: }
এবং }
এগুলো দুটি for
লুপ বন্ধ করে। ইনপুট শেষে আমরা "১" এর পজিশন জানি।
লাইন ১৬: int moves = abs(row - 2) + abs(col - 2);
এটি সর্বনিম্ন মুভের সংখ্যা গণনা করে:
abs(row - 2)
: "১" এর বর্তমান সারি থেকে টার্গেট সারি (২) এর দূরত্ব।abs
পরম মান দেয়।abs(col - 2)
: "১" এর বর্তমান কলাম থেকে টার্গেট কলাম (২) এর দূরত্ব।- দুটির যোগফল হলো মোট মুভ।
লাইন ১৭: cout << moves << endl;
এটি moves
এর মান প্রিন্ট করে এবং একটি নতুন লাইন যোগ করে।
লাইন ১৮: return 0;
এটি প্রোগ্রাম শেষ করে এবং ০ রিটার্ন করে, যা বোঝায় প্রোগ্রাম সফলভাবে চলেছে।
লাইন ১৯: }
এটি main
ফাংশন বন্ধ করে।
উদাহরণ
ইনপুট:
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ব্যাখ্যা: "১" আছে (১, ৪) পজিশনে। মুভ = |১-২| + |৪-২| = ১ + ২ = ৩।
আউটপুট: ৩
কেন এটি কাজ করে?
প্রতিটি মুভে "১" একটি পজিশন সরে। সারি এবং কলামের দূরত্ব আলাদাভাবে গণনা করে আমরা সর্বনিম্ন মুভ পাই। এটি সবচেয়ে দ্রুত এবং সহজ পদ্ধতি।
0 comments:
Post a Comment