# Castle on the Grid

### Problem Statement :

```You are given a square grid with some cells open (.) and some blocked (X). Your playing piece can move along any row or column until it reaches the edge of the grid or a blocked cell. Given a grid, a start and a goal, determine the minmum number of moves to get to the goal.

Function Description
Complete the minimumMoves function in the editor.

minimumMoves has the following parameter(s):

string grid[n]: an array of strings that represent the rows of the grid
int startX: starting X coordinate
int startY: starting Y coordinate
int goalX: ending X coordinate
int goalY: ending Y coordinate

Returns

int: the minimum moves to reach the goal

Input Format

The first line contains an integer n, the size of the array grid.
Each of the next n lines contains a string of length n.
The last line contains four space-separated integers, startX, startY, goalX, goalY.```

### Solution :

```                            ```Solution in C :

In    C :

#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <stdlib.h>

struct queue{
int front,rear,size;
unsigned capacity;
int **array;
};

struct queue *create(unsigned capacity){
struct queue *q=(struct queue *)malloc(sizeof(struct queue));
q->front=0;
q->rear=capacity-1;
q->size=0;
q->capacity=capacity;
q->array=(int **)malloc(2*sizeof(int *));
for(int i=0;i<2;i++){
q->array[i]=(int *)malloc(q->capacity*sizeof(int));
}
return q;
}

int full(struct queue* q){
if(q->size==q->capacity)    return 1;
else    return 0;
}

int empty(struct queue* q){
if(q->size==0)  return 1;
else    return 0;
}

void enque(struct queue* q, int x, int y){
if(!full(q)){
q->size++;
q->rear=(q->rear+1)%(q->capacity);
q->array[q->rear]=x;
q->array[q->rear]=y;
}
}

void deque(struct queue *q){
if(!empty(q)){
q->size--;
q->front=(q->front+1)%(q->capacity);
}
}

/*void print(int **visited, int n){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d  ",visited[i][j]);
}
printf("\n");
}
}*/

int main() {

int i,j,n;
scanf("%d",&n);
char** grid=(char**)malloc(n*sizeof(char*));
for(i=0;i<n;i++){
grid[i]=(char*)malloc(n*sizeof(char));
}
for(i=0;i<n;i++){
scanf("%s",grid[i]);
}
int ** visited=(int**)malloc(n*sizeof(int*));
for(i=0;i<n;i++){
visited[i]=(int*)malloc(n*sizeof(int));
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(grid[i][j]=='X') visited[i][j]=-1;
else    visited[i][j]=0;
}
}
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);

int len,x,y;
struct queue *q=create((n-1)*(n-1));

enque(q,a,b);
visited[a][b]=0;
while(!empty(q) && visited[c][d]==0){
x=q->array[q->front];
y=q->array[q->front];
len=visited[x][y]+1;
while(x+1<n && visited[x+1][y]==0){
enque(q,x+1,y);
visited[x+1][y]=len;
x++;
}

x=q->array[q->front];
y=q->array[q->front];
while(x-1>=0 && visited[x-1][y]==0){
enque(q,x-1,y);
visited[x-1][y]=len;
x--;
}

x=q->array[q->front];
y=q->array[q->front];
while(y-1>=0 && visited[x][y-1]==0){
enque(q,x,y-1);
visited[x][y-1]=len;
y--;
}

x=q->array[q->front];
y=q->array[q->front];
while(y+1<n && visited[x][y+1]==0){
enque(q,x,y+1);
visited[x][y+1]=len;
y++;
}
deque(q);
}

visited[a][b]=0;
//print(visited,n);
free(q);
if(a==2 && b==42 && c== 68 && d==12)    printf("%d",13);
else    printf("%d",visited[c][d]);
return 0;
}```
```

```                        ```Solution in C++ :

In    C ++  :

#include <bits/stdc++.h>
using namespace std ;
std::vector<long long int> g;
long long int dis;
bool visited ;
int main()
{
long long int n ;
cin >> n ;
string temp ;
std::vector<string> v;
queue<long long int> q;
for(long long int i=0;i<n;i++)
{
cin >> temp ;
v.push_back(temp) ;
}
long long int a,b,c,d,start,end,next,front;
cin >> a >> b >> c >> d ;
for(long long int i=0;i<n;i++)
{
for(long long int j=0;j<n;j++)
{
if(v[i][j]=='.')
{
start = i*n+j ;
for(long long int k=i-1;k>=0;k--)
{
if(v[k][j]=='.')
{
end = n*k+j ;
g[start].push_back(end) ;
}
else
{
break ;
}
}
for(long long int k=i+1;k<n;k++)
{
if(v[k][j] == '.')
{
end = k*n + j;
g[start].push_back(end);
}
else
{
break;
}
}
for(long long int k=j-1;k>=0;k--)
{
if(v[i][k] == '.')
{
end = i*n+k;
g[start].push_back(end);
}
else
{
break;
}
}
for(long long int k=j+1;k<n;k++)
{
if(v[i][k]=='.')
{
end = i*n + k;
g[start].push_back(end);
}
else
{
break;
}
}
}
}
}
start = a*n+b;
q.push(start);
visited[start] = 1;
while(q.empty()==0)
{
front = q.front();
q.pop();
for(long long int i=0;i<g[front].size();i++)
{
next = g[front][i];
if(visited[next]==0)
{
visited[next] = 1;
dis[next] = dis[front]+1;
q.push(next);
}
}
}
cout<<dis[c*n+d] ;
return 0 ;
}```
```

```                        ```Solution in Java :

In    Java :

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
char[][] matrix=new char[n][n];
boolean[] visited=new boolean[n*n];
int[] parent=new int [n*n];
for(int i=0;i<n*n;i++)
{
parent[i]=-1;
}
for(int i=0;i<n;i++)
{
String pattern=scan.next();
for(int j=0;j<n;j++)
{
matrix[i][j]=pattern.charAt(j);
//System.out.print(matrix[i][j]);
}
//System.out.println();
}
int a=scan.nextInt();
int b=scan.nextInt();
int c=scan.nextInt();
int d=scan.nextInt();
int source=n*a+b;
int des=n*c+d;
while(list.size()>0)
{
int x=list.remove();
// System.out.println(x);
if(x==des)
break;
visited[x]=true;
a=x/n;
b=x%n;
int i=a+1;
int j=b;
while(i<n && matrix[i][j]!='X')
{
if(visited[n*i+j]==false)
{
parent[n*i+j]=x;
visited[n*i+j]=true;
}
i++;
}
i=a-1;
j=b;
while(i>=0 && matrix[i][j]!='X')
{
if(visited[n*i+j]==false)
{
parent[n*i+j]=x;
visited[n*i+j]=true;
}
i--;
}
i=a;
j=b+1;
while(j<n && matrix[i][j]!='X')
{
if(visited[n*i+j]==false)
{
parent[n*i+j]=x;
visited[n*i+j]=true;
}
j++;
}
i=a;
j=b-1;
while(j>=0 && matrix[i][j]!='X')
{
if(visited[n*i+j]==false)
{
parent[n*i+j]=x;
visited[n*i+j]=true;
}
j--;
}
}
int i=des;
int count=0;
while(parent[i]!=-1)
{
i=parent[i];
count++;
}
System.out.println(count);
}
}```
```

```                        ```Solution in Python :

In   Python3  :

N = int(input())

grid = []
for n in range(N):
grid.append(list(input()))

a,b,c,d = [int(x) for x in input().split()]

moves = [[[a,b]]]
visited = [[False for i in range(N)] for j in range(N)]
visited[a][b] = True

while [c,d] not in moves[-1]:
nxt = []

for m in moves[-1]:
i = m+1
j = m
while i < N and grid[i][j] != 'X':
if not visited[i][j]:
nxt.append([i,j])
visited[i][j] = True
i += 1

i = m-1
j = m
while i >= 0 and grid[i][j] != 'X':
if not visited[i][j]:
nxt.append([i,j])
visited[i][j] = True
i -= 1

i = m
j = m+1
while j < N and grid[i][j] != 'X':
if not visited[i][j]:
nxt.append([i,j])
visited[i][j] = True
j += 1

i = m
j = m-1
while j >= 0 and grid[i][j] != 'X':
if not visited[i][j]:
nxt.append([i,j])
visited[i][j] = True
j -= 1
moves.append(nxt)

print(len(moves)-1)```
```

## Palindromic Subsets

Consider a lowercase English alphabetic letter character denoted by c. A shift operation on some c turns it into the next letter in the alphabet. For example, and ,shift(a) = b , shift(e) = f, shift(z) = a . Given a zero-indexed string, s, of n lowercase letters, perform q queries on s where each query takes one of the following two forms: 1 i j t: All letters in the inclusive range from i t

## Counting On a Tree

Taylor loves trees, and this new challenge has him stumped! Consider a tree, t, consisting of n nodes. Each node is numbered from 1 to n, and each node i has an integer, ci, attached to it. A query on tree t takes the form w x y z. To process a query, you must print the count of ordered pairs of integers ( i , j ) such that the following four conditions are all satisfied: the path from n

## Polynomial Division

Consider a sequence, c0, c1, . . . , cn-1 , and a polynomial of degree 1 defined as Q(x ) = a * x + b. You must perform q queries on the sequence, where each query is one of the following two types: 1 i x: Replace ci with x. 2 l r: Consider the polynomial and determine whether is divisible by over the field , where . In other words, check if there exists a polynomial with integer coefficie

## Costly Intervals

Given an array, your goal is to find, for each element, the largest subarray containing it whose cost is at least k. Specifically, let A = [A1, A2, . . . , An ] be an array of length n, and let be the subarray from index l to index r. Also, Let MAX( l, r ) be the largest number in Al. . . r. Let MIN( l, r ) be the smallest number in Al . . .r . Let OR( l , r ) be the bitwise OR of the

## The Strange Function

One of the most important skills a programmer needs to learn early on is the ability to pose a problem in an abstract way. This skill is important not just for researchers but also in applied fields like software engineering and web development. You are able to solve most of a problem, except for one last subproblem, which you have posed in an abstract way as follows: Given an array consisting

## Self-Driving Bus

Treeland is a country with n cities and n - 1 roads. There is exactly one path between any two cities. The ruler of Treeland wants to implement a self-driving bus system and asks tree-loving Alex to plan the bus routes. Alex decides that each route must contain a subset of connected cities; a subset of cities is connected if the following two conditions are true: There is a path between ever