Editorial for MKJUMPS problem spoj - UCS - Unleash-Coding-Skills

Sunday, 4 March 2018

Editorial for MKJUMPS problem spoj - UCS

this is solution for making jumps problem in spoj

A knight is a piece used in the game of chess. The chessboard itself is square array of cells. Each time a knight moves, its resulting position is two rows and one column, or two columns and one row away from its starting position. Thus a knight starting on row r, column c – which we’ll denote as (r,c) – can move to any of the squares (r-2,c-1), (r-2,c+1), (r-1,c-2), (r-1,c+2), (r+1,c-2), (r+1,c+2), (r+2,c-1), or (r+2,c+1). Of course, the knight may not move to any square that is not on the board.

Suppose the chessboard is not square, but instead has rows with variable numbers of columns, and with each row offset zero or more columns to the right of the row above it. The figure to the left illustrates one possible configuration. How many of the squares in such a modified chessboard can a knight, starting in the upper left square (marked with an asterisk), not reach in any number of moves without resting in any square more than once?
If necessary, the knight is permitted to pass over regions that are outside the borders of the modified chessboard, but as usual, it can only move to squares that are within the borders of the board.


Input

There will be multiple cases to consider. The input for each case begins with an integer n, between 1 and 10, that specifies the number of rows in the modified chessboard. Following n there will be n pairs of integers, with the ith pair corresponding to the ith row of the chessboard. The first integer of each pair indicates the number of squares skipped at the beginning of the row. The second integer indicates the number of squares in the row (which will always be at least 1).The last case will be followed by the integer 0.

For example, input for the case illustrated by the chessboard shown above would be:

7 0 3 0 3 0 4 0 4 1 3 1 7 4 4

The maximum dimensions of the board will be 10 rows and 10 columns. That is, any modified chessboard specified by the input will fit completely on a 10 row, 10 column board.


Output

For each input case, display the case number (1, 2, …), and the number of squares that the knight can not reach. Display the results in the format shown in the examples below.


Example


Input:
7 0 3 0 3 0 4 0 4 1 3 1 7 4 4
3 0 3 0 3 0 3
2 0 1 2 1
0

Output:
Case 1, 4 squares can not be reached.
Case 2, 1 square can not be reached.
Case 3, 0 squares can not be reached.
#include <iostream>

#include <cstdio>

using namespace std;

int cnt,cas;

char a[11][11];

int inf=32000;

int ai[] = {-2, -2, -1, 1, 2, 2, 1, -1}, b[] = {-1, 1, 2, 2, 1, -1, -2, -2}, visitedNodes=-inf;

int isvalid(int x,int y,int r,int c)

{

      if(x>=0&&x<r&&y>=0&&y<c)

      return 1;

      else return 0;

}

int uu,ww;

void init()

{

  

      for( uu=0;uu<11;uu++)

      {

            for( ww=0;ww<11;ww++)

            {

                  a[uu][ww]='#';

            }

      }

}

void dfs(int x,int y,int r,int c,int cntNodes)

{

      a[x][y]='v';

      bool noRoute=true;

      for(int i=0;i<8;i++)

      {

            int temx=x+ai[i];

            int temy=y+b[i];

            if(isvalid(temx,temy,r,c)&&a[temx][temy]=='.')

            {

                  noRoute=false;

                  dfs(temx,temy,r,c,cntNodes+1);

            }

        

      }

      if(noRoute)

      {



            if(visitedNodes<cntNodes)

      {

              

            visitedNodes=cntNodes;

      }

      }

      a[x][y]='.';

}

int main() {

int i,j,k,row,c1,c2,cas=1;

while(1)

{

      scanf("%d",&row);

      if(row==0)

      break;

      cnt=0;

      init();

  

      visitedNodes=-inf;

      for(i=0;i<row;i++)

      {

            scanf("%d %d",&c1,&c2);

            for(j=c1;j<c1+c2;j++)

            {

            a[i][j]='.';

            cnt++;

            }

      }

      dfs(0,0,10,10,1);



      int res=cnt-visitedNodes;

      if(res == 1)

            printf("Case %d, 1 square can not be reached.\n", cas++);

        else

            printf("Case %d, %d squares can not be reached.\n", cas++, res);



  

}

 return 0;





}

No comments:

Post a comment