মান লেযিয়ে একটি ২-ডাইমেনশনাল গ্রিড আছে R সারি এবং C কলামের, আমরা (r0, c0) থেকে শুরু করি এবং পূর্ব দিকে মুখ করে থাকি। গ্রিডের উত্তর-पশ্চিম কোণ প্রথম সারি ও কলামে, দক্ষিণ-পূর্ব কোণ শেষ সারি ও কলামে। আমরা ঘড়ির কাঁটা অনুযায়ী স্পায়রাল আকারে চলে যাব গ্রिडের প্রতিটি পজিশন ভিজিট করতে। গ্রিডের বাউন্ডারি বাইরে চলে গেলেও চলতে থাকব (পরে গ্রিডের বাউন্ডারিতে ফিরে আসতে পারি)। গ্রিডের পজিশনগুলো ভিজিট হওয়ার ক্রম অনুযায়ী কোঅর্ডিনেটের তালিকা রিটার্ন করতে হবে।
এটি সমাধান করার জন্য আমরা নিচের ধাপগুলো অনুসরণ করব -
dirr := [[0,1],[1,0],[0,-1],[-1,0]] তৈরি করুন
ret ম্যাট্রিক্স, len := 0, dir := 0 তৈরি করুন
ret-এ (r0, c0) ইনসার্ট করুন
যখন ret.size() < R*C
যদি dir == 0 বা dir == 2 হয়, len++ করুন
i = 0 থেকে len-1 পর্যন্ত লুপ চালান
r0 := r0 + dirr[dir][0], c0 := c0 + dirr[dir][1]
যদি r0 ০ থেকে R-এ এবং c0 ০ থেকে C-এ থাকে, ret-এ (r0, c0) ইনসার্ট করুন
dir := (dir + 1) % 4
ret রিটার্ন করুন
নিচের বাস্তবায়নটি দেখে আরও ভালো বুঝতে পারবেন -
উদাহরণ
#include <bits/stdc++.h> using namespace std; void print_vector(vector<vector<auto> > v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << "["; for(int j = 0; j <v[i].size(); j++){ cout << v[i][j] << ", "; } cout << "],"; } cout << "]"<<endl; } int dirr[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; class Solution { public: vector<vector<int>> spiralMatrixIII(int R, int C, int r0, int c0) { vector < vector <int> > ret; int len = 0; int dir = 0; ret.push_back({r0, c0}); while(ret.size() < R * C){ if(dir == 0 || dir == 2) len++; for(int i = 0; i < len; i++){ r0 = r0 + dirr[dir][0]; c0 = c0 + dirr[dir][1]; if(r0 < 0 || c0 < 0 || c0 >= C || r0 >= R) continue; ret.push_back({r0, c0}); } dir = (dir + 1) % 4; } return ret; } }; main(){ Solution ob; print_vector(ob.spiralMatrixIII(5,5,1,3)); }ইনপুট
5 5 1 3
আউটপুট
[[1,3],[1,4],[2,4],[2,3],[2,2],[1,2],[0,2],[0,3],[0,4],[3,4],[3,3],[3,2],[3,1],[2,1],[1,1],[0,1],[4,4],[4,3],[4,2],[4,1],[4,0],[3,0],[2,0],[1,0],[0,0]]