Skip to content
Programmingoneonone
Programmingoneonone

Learn everything about programming

  • Home
  • CS Subjects
    • Internet of Things (IoT)
    • Digital Communication
    • Human Values
    • Cybersecurity
  • Programming Tutorials
    • C Programming
    • Data structures and Algorithms
    • 100+ Java Programs
    • 100+ C Programs
  • HackerRank Solutions
    • HackerRank Algorithms Solutions
    • HackerRank C problems solutions
    • HackerRank C++ problems solutions
    • HackerRank Java problems solutions
    • HackerRank Python problems solutions
Programmingoneonone
Programmingoneonone

Learn everything about programming

HackerEarth Puzzled Grid problem solution

YASH PAL, 31 July 2024
In this HackerEarth Puzzled Grid problem solution Today, you need to solve a problem on a Puzzled Grid game. “In a grid of n x n size, where each cell has a positive integer, two players compete in several rounds.
Each round starts by both players putting a rock in a random location of the grid. Then, the two players must connect the two rocks with a line that passes through the grid cells (e.g: from a grid cell the line can can expand either horizontally or vertically and never out the grid). Since there may be a lot of ways to connect the two stones, we are only interested in those lines that minimizes the highest cell in their path (e.g: the cell with the highest number should be as small as possible).
You need to find and print this minimized maximum. Can you do it?
HackerEarth Puzzled Grid problem solution

HackerEarth Puzzled Grid problem solution.

#include <stdio.h>
#include <vector>
#include <algorithm>
#include <map>
#include <set>

#define maxn 3000

using namespace std;

int p[maxn*maxn];
int sizeOf[maxn*maxn];

int get( int x ) {
if( p[x] != x ) {
p[x] = get(p[x]);
}
return p[x];
}

void Union( int x, int y ) {
x = get(x), y = get(y);

if( x != y ) {
if( sizeOf[x] < sizeOf[y] ) {
swap(x, y);
}

p[y] = x;
sizeOf[x] += sizeOf[y];
}
}

void init( int n ) {
for( int i = 0; i < n; i++ ) {
p[i] = i;
sizeOf[i] = 1;
}
}

int grid[maxn][maxn];
vector<pair<int,int>> cells[1000001];
vector<int> s[1000001];


int main( void ) {
int n, q;
scanf("%i %i", &n, &q);

const int max_num = 1000000;

for( int i = 0; i < n; i++ ) {
for( int j = 0; j < n; j++ ) {
scanf("%i", &grid[i][j]);
cells[grid[i][j]].push_back(make_pair(i,j));
}
}

vector<int> X1(q), Y1(q), X2(q), Y2(q);
vector<int> lo(q), hi(q), ans(q);

for( int i = 0; i < q; i++ ) {
scanf("%i %i %i %i", &X1[i], &Y1[i], &X2[i], &Y2[i]);
lo[i] = 1, hi[i] = int(1e6)+1;
}

int lg = 21;
while( lg-- ) {
for( int i = 0; i < q; i++ ) {
if( lo[i] <= hi[i] ) {
int mid = (lo[i] + hi[i]) / 2;
s[mid].push_back(i);
}
}

init(n*n);

for( int e = 1; e <= max_num; e++ ) {
if( !cells[e].empty() ) {
for( auto cell : cells[e] ) {
int dx[] = {0, 0, +1, -1};
int dy[] = {+1, -1, 0, 0};

int x = cell.first, y = cell.second;
for( int c = 0; c < 4; c++ ) {
int nx = x + dx[c], ny = y + dy[c];

if( (nx >= 0) && (nx < n) && (ny >= 0) && (ny < n) ) {
if( grid[nx][ny] <= grid[x][y] ) {
int cellId0 = (x * n) + y;
int cellId1 = (nx * n) + ny;
Union(cellId0, cellId1);
}
}
}
}
}

if( !s[e].empty() ) {
for( int idx : s[e] ) {
int cellId0 = (X1[idx] * n) + Y1[idx];
int cellId1 = (X2[idx] * n) + Y2[idx];

if( get(cellId0) == get(cellId1) ) {
ans[idx] = e;
hi[idx] = e - 1;
} else {
lo[idx] = e + 1;
}
}
}
}

for( int i = 1; i <= max_num; i++ ) {
s[i].clear();
}
}

for( int i = 0; i < q; i++ ) {
printf("%in", ans[i]);
}

return 0;
}

Second solution

#include <fstream>
#include <iostream>
#include <string>
#include <complex>
#include <math.h>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <stack>
#include <algorithm>
#include <list>
#include <ctime>
#include <memory.h>
#include <assert.h>

#define y0 sdkfaslhagaklsldk

#define y1 aasdfasdfasdf
#define yn askfhwqriuperikldjk
#define j1 assdgsdgasghsf
#define tm sdfjahlfasfh
#define lr asgasgash
#define norm asdfasdgasdgsd
#define have adsgagshdshfhds

#define eps 1e-6
#define M_PI 3.141592653589793
#define bs 1000000007
#define bsize 350

using namespace std;

const int INF = 1e9;
const int N = 531;
const int M = 600031;

int n, m, ar[N][N];
int x1[M], y1[M], x2[M], y2[M];

vector<pair<int, pair<int, int> > > val_list;
int l[M], r[M];

vector<int> qu_list[M];
int w[M];

int get(int x)
{
if (x == w[x])
return x;
return w[x] = get(w[x]);
}

bool outside(int a, int b)
{
if (a < 0 || a >= n || b < 0 || b >= n)
return true;
return false;
}

void merge(int a, int b)
{
w[a] = b;
}

bool is_inside(int a, int b)
{
return (a >=0 && a < n&&b >= 0 && b < n);
}

void run_merger(int a, int b)
{
for (int dx = -1; dx <= 1; dx++)
{
for (int dy = -1; dy <= 1; dy++)
{
if (abs(dx) + abs(dy) != 1)
continue;
if (outside(a + dx, b + dy))
continue;
if (ar[a + dx][b + dy] > ar[a][b])
continue;
int id1 = a*n + b;
int id2 = (a + dx)*n + (b + dy);
id1 = get(id1);
id2 = get(id2);
merge(id1, id2);
}
}
}

int main(){
ios_base::sync_with_stdio(0);
//cin.tie(0);

//cin >> n >> m;
assert(cin >> n >> m);

assert(2 <= n &&n <= 500);
assert(m >= 1 && m <= 1e5);

for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
//cin >> ar[i - 1][j - 1];
assert(cin >> ar[i - 1][j - 1]);
assert(ar[i - 1][j - 1] >= 1 && ar[i - 1][j - 1] <= 1e6);
}
}

for (int i = 1; i <= m; i++)
{
// cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
assert(cin >> x1[i] >> y1[i] >> x2[i] >> y2[i]);
assert(x1[i] != x2[i] || y1[i] != y2[i]);
assert(is_inside(x1[i], y1[i]));
assert(is_inside(x2[i], y2[i]));
}

for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
val_list.push_back(make_pair(ar[i - 1][j - 1], make_pair(i - 1, j - 1)));
}
}

sort(val_list.begin(), val_list.end());

for (int i = 1; i <= m; i++)
{
l[i] = 0;
r[i] = val_list.size() - 1;
}

int I = 0;

while (true)
{
for (int i = 0; i < val_list.size(); i++)
qu_list[i].clear();

int flag = 0;

for (int i = 1; i <= m; i++)
{
if (l[i] == r[i])
continue;
flag = 1;
int mid = l[i] + r[i];
mid /= 2;
qu_list[mid].push_back(i);
}

++I;
if (flag == 0)
break;

for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
w[i*n + j] = i*n + j;
}
}

for (int i = 0; i < val_list.size(); i++)
{
int qi = val_list[i].second.first;
int qj = val_list[i].second.second;

run_merger(qi, qj);

for (int j = 0; j < qu_list[i].size(); j++)
{
int id = qu_list[i][j];
int ps1 = x1[id] * n + y1[id];
int ps2 = x2[id] * n + y2[id];
// cout << ps1 << "%" << ps2 << endl;
ps1 = get(ps1);
ps2 = get(ps2);
// cout << id << "%" << i << endl;
if (ps1 == ps2)
r[id] = i;
else
l[id] = i + 1;
}
}
}

for (int i = 1; i <= m; i++)
{
cout << val_list[l[i]].first << endl;
}

cin.get(); cin.get();
return 0;
}
coding problems solutions

Post navigation

Previous post
Next post

Are you a student and stuck with your career or worried about real-time things, and don't know how to manage your learning phase? Which profession to choose? and how to learn new things according to your goal, and land a dream job. Then this might help to you.

Hi My name is YASH PAL, founder of this Blog and a Senior Software engineer with 5+ years of Industry experience. I personally helped 40+ students to make a clear goal in their professional lives. Just book a one-on-one personal call with me for 30 minutes for 300 Rupees. Ask all your doubts and questions related to your career to set a clear roadmap for your professional life.

Book session - https://wa.me/qr/JQ2LAS7AASE2M1

Pages

  • About US
  • Contact US
  • Privacy Policy

Follow US

  • YouTube
  • LinkedIn
  • Facebook
  • Pinterest
  • Instagram
©2026 Programmingoneonone | WordPress Theme by SuperbThemes