Monday, 20 August 2012

N QUEEN PROBLEM: On a NxN board place N queens such that no queen is under attack where a queen can move any steps horizontally, vertically and diagnolly.


public class Nqueen {

      private final int dim = 8;
      private final int queen = 1;
      private int[][] chessBoard  = new int[dim][dim];
      private int count = 0;
      private int startrow = 0;
   
      public void initialize()
      {
            setUpBoard();
            solve(0); 
            System.out.println("\n\nTOTAL NO. OF SOLUTIONS : " + count);
      }
   
 
   /*
         * This function checks whether a queen can be place in cell marked by (row,col)
         * If yes then returns true
         * Else returns false
   */
      public boolean isSafe(int row, int col)
      {
            for(int i=0; i<dim ; i++)
            {
                  if(chessBoard[i][col] == queen && i!= row)
                      return false;
                  if(chessBoard[row][i] == queen && i != col)
                      return false;
            }
         
            //diagnol check
            int i = row-1 , j= col-1;
            while(i>=0 && j>=0)
            {
                  if(chessBoard[i][j] == queen)
                      return false;
                  i--;
                  j--;
            }
         
            i = row+1;
            j=col+1;
            while(i<dim && j<dim)
            {
                  if(chessBoard[i][j] == queen)
                      return false;
                  i++;
                  j++;
            }
         
            i= row-1;
            j = col+1;
            while(i>=0 && j<dim)
            {
            if(chessBoard[i][j] == queen)
           return false;
            i--;
            j++;
            }
         
            i = row+1;
            j = col-1;
            while(i<dim && j>=0)
            {
                  if(chessBoard[i][j] == queen)
                       return false;
                  i++;
                  j--;
            }
            return true;
      }
   
 
   /*
         * This function initialized board to all 0's
   */
      public void setUpBoard()
      {
            for(int i=0; i<dim ; i++)
            {
                  for(int j=0; j<dim ; j++)
                  {
                      chessBoard[i][j] = 0;
                  }
            }
      }
   
 
   /*
         * This function place a queen at row, col position
   */
      public void placeQueen(int row, int col)
      {
            chessBoard[row][col] = queen;
      }
   
 
   /*
         * This function removes a queen placed at row, col position
   */
      public void removeQueen(int row, int col)
      {
            chessBoard[row][col] = 0;
      }
   
 
 
   /*
         * This function displays the chess board.
   */
      public void displayChessBoard()
      {
            for(int i=0 ; i< dim  ; i++)
            {
                  System.out.println();
                  for(int j=0 ; j<dim ; j++)
                  {
                      System.out.print(chessBoard[i][j] + "  ");
                  }
            }
      }
   
   
   /*
         * This function uses backtracking approach and check all possible test cases.
   */
      public void solve(int col)
      {
            if(col >= dim)
            {
                  count++;
                  System.out.println();
                  displayChessBoard();
                  return;
            }
            for(int row =startrow ; row<dim ; row++)
            {
                  if(isSafe(row,col))
                  {
                      placeQueen(row,col);
                      solve(col+1);
                      removeQueen(row,col);
                  }
            }
      }
   
 
      public static void main(String args[])
      {
            Nqueen n = new Nqueen();
            n.initialize();
      }
}


Sunday, 12 August 2012

Given an array containing only 0's and 1's, now we have to find the maximum subarray which contain equal no of 0's and 1's. Time complexity O(n).

/*
Logic for this program is taken from a post on geeksforgeeks.
I couldn't deduce an O(n) logic.
*/
#include<conio.h>
#include<iostream.h>

void main()
{
      clrscr();
      int array[]={1,0,0,1,0,1,1};
      int len = sizeof(array)/sizeof(int);
      int *sum = new int[len];
      sum[0]=((array[0]==0)?-1:1);
      int min=array[0],max=array[0];
      for(int i=1;i<len;i++)
      {
            sum[i]=sum[i-1]+((array[i]==0)?-1:1);
            if(sum[i]>max)
                  max=sum[i];
            if(sum[i]<min)
                  min=sum[i];
      }

      int *hash = new [max-min+1];
      int maxsize =-1,startindex;
      for( i=0;i<max-min+1;i++)
            hash[i]=-1;
      for(i=0;i<len;i++)
      {
            if(sum[i]==0)
            {
                  maxsize=i+1;
                  startindex=0;

            }
            if(hash[sum[i]-min]==-1)
                  hash[sum[i]-min]=i;
            else
            {
                  if((i-hash[sum[i]-min]) > maxsize)
                  {
                        maxsize=i-hash[sum[i]-min];
                        startindex = hash[sum[i]-min];
                  }
            }
      }
      cout<<"\n START : "<<startindex;
      cout<<"\n END   : "<<maxsize+startindex-1;
      getch();
}

Wednesday, 8 August 2012

Without using extra space place all zeroes to left and 1's to right from an array of Zero's and 1's as below 011001 ans. 000111


#include<iostream.h>
#include<conio.h>
void main()
{
      clrscr();
      int a[]={0,1,1,0,0,1};
      int n=sizeof(a)/sizeof(int);
      int i=0,j=n-1;
      while(i<j)
      {
            if(a[i]==0)
                  i++;
            if(a[j]==1)
                  j--;
            if(a[i]==1 && a[j]==0)
            {
                  a[i]=0;
                  a[j]=1;
                  i++;
                  j--;
            }
      }
      for(i=0;i<n;i++)
            cout<<" "<<a[i];
      getch();
}

Find the subset of an array having maximum sum

#include<iostream.h>
#include<conio.h>
void main()
{
      clrscr();
      int a[]={1,3,-8,2,-1,10,-2,1};
      int n=sizeof(a)/sizeof(int);
      int sum=a[0];
      int max=-1;
      int start,end,s=0,e=0;
      for(int i=1;i<n;i++)
      {
            if(sum>=max)
            {
                  start=s;
                  end=e;
                  max=sum;
            }
            if(sum<0)
            {
                  s=e=i;
                  sum=a[i];
                  continue;
            }
            sum+=a[i];
            e=i;
      }
      cout<<max;
      getch();
}


There is an integer array consisting positive and negative integers. Find maximum positive difference S defined as: S = a[i] - a[j] where i>j and S > 0


#include<iostream.h>
#include<conio.h>
void main()
{
      clrscr();
      int arr[] ={-3,5,2,-2,1,0,-6,7,-8,2};
      int n=10,min=arr[0],max=-32767      ;
      for(int i=1;i<n;i++)
      {
            if(arr[i]<min)
            {
                  min=arr[i];
                  continue;
            }
            if(arr[i]-min>max)
                  max=arr[i]-min;
      }
      cout<<"MAX DIFFERENCE IS : "<<max;
            getch();
}




Find 3 numbers in the given array such that their sum is equal to a given number.


#include<iostream.h>
#include<conio.h>
int array[]={10,20,30,40,50,60,70,80,90};
int n=9;
int check(int k,int val)
{
      int i=0,j=n-1;
      static int flag;
      while(i<j)
      {
            if(i==k)
            {
                  i++;
                  continue;
            }
            if(j==k)
            {
                  j--;
                  continue;
            }
            if(array[i]+array[j]==val)
            {
                  cout<<"\n"<<array[i]<<" + "<<array[j]<<" + "<<array[k]<<" = "<<val+array[k];
                  flag++;
                  i++;
                  j--;
            }
            else if(array[i]+array[j]>val)
                  j--;
            else
                  i++;
      }
      return flag;
}
void main()
{
      clrscr();

      int val,flag;
      cout<<"Enter the value ";
      cin>>val;
      cout<<" \n\n";
      for(int i=0;i<n;i++)
            flag=check(i,val-array[i]);
      if(flag==0)
            cout<<"\n No such elements ";

      getch();
}

Inorder and Preorder tree traversal without recursion.

#include<iostream.h>
#include<process.h>
#include<math.h>
#include<conio.h>
class node
{
public:
      node *left;
      node *right;
      int data;
      node()
      {
            left=NULL;
            right=NULL;
      }
}*root=NULL;

int flag=0;
void add(node *parent,node *r,int d,int level,int item)
{
      if(r!=NULL)
      {
            add(r,r->left,d+1,level,item);
            add(r,r->right,d+1,level,item);
      }
      else if(d==level &&  flag!=1)
      {
            flag=1;
            node *newnode = new node;
            newnode->data=item;
            if(parent->left==NULL)
                  parent->left=newnode;
            else
                  parent->right=newnode;
      }
}

void npreorder()
{
      node *ptr=root;
      int top=-1;
      node **stack = new node*[50];
      while(1)
      {
            if(ptr!=NULL)
            {
                  cout<<"  "<<ptr->data;
                  if(ptr->right!=NULL)
                        stack[++top]=ptr->right;
                  ptr=ptr->left;
            }
            else
            {
                  ptr=stack[top--];
                  if(top==-2)
                        return;
            }
      }
}
void ninorder()
{
      node **stack= new node*[50];
      int top=0;
      node *ptr=root,*process=NULL;
      while(top>=0)
      {
            if(ptr && process!=ptr)
            {
                  stack[++top]=ptr;
                  ptr=ptr->left;
            }
            else
            {
                  ptr=stack[top--];
                  process=ptr;
                  cout<<"  "<<ptr->data;
                  if(ptr->right)
                        ptr=ptr->right;
            }
      }
}

void main()
{
      clrscr();
      int ch,item;
      cout<<"1.ADD\n2.PREORDER\n3.DEPTH\n4.NO OF ELEMENTS\n5.TRACE";
      cout<<"\n6.BFS AND DFS\n7.EXIt";
      while(1)
      {
            cout<<"\nchoice? ";
            cin>>ch;
            switch(ch)
            {
                  case 1: cout<<"ITEM :";
                        cin>>item;
                        flag=0;
                        if(root==NULL)
                        {
                              node *newnode = new node;
                              newnode->data=item;
                              root=newnode;
                        }
                        else
                        {
                              maxdepth=0;
                              depth(root,0);
                              int level;
                              int elements=count(root);
                              if(elements==(pow(2,maxdepth+1)-1))
                                    level=maxdepth+1;
                              else
                                    level=maxdepth;
                              add(root,root,0,level,item);
                        }
                        break;
                  case 2: ninorder();
                        //npreorder();
                        //preorder(root);
                        break;
                  case 3: maxdepth=0;
                        depth(root,0);
                        cout<<maxdepth;
                        break;
                  case 4: cout<<count(root);
                        break;
                  case 5: equal=0;
                        cout<<"ITEM TO TRACE : ";
                        cin>>item;
                        trace(root,item);
                        break;
                  case 6: cout<<"\nBFS\n";
                        bfs();
                        cout<<"\nDFS\n";
                        dfs();
                        break;
                  case 7:     exit(0);
            }
      }
}

Count the number of elements in a binary tree.


int count(node *r)
{
      if(r==NULL)
            return 0;
      else
      {
            int c=1;
            c+=count(r->left);
            c+=count(r->right);
            return c;
      }

}

calculate the depth of the binary tree.


int maxdepth=0;
void depth(node *r,int d)
{
      if(r!=NULL)
      {
            if(maxdepth<d)
                  maxdepth=d;
            depth(r->left,d+1);
            depth(r->right,d+1);
      }
}

In a binary tree given any node, trace its path from root node.


//set equal=0 before calling trace function.

int equal=0;
void trace(node *r,int item)
{
      if(equal==1)
            return;

      if(r->data==item)
            equal=1;
      if(r!=NULL)
      {
            trace(r->left,item);
            trace(r->right,item);
            if(equal==1)
                  cout<<"  "<<r->data;
      }
}

Print bfs and dfs traversal of binary tree.


void bfs()
{
      if(root==NULL)
      {
            cout<<"\nEMPTY LIST";
            return;
      }
      node **queue = new node*[count(root)];
      int front=0;
      int rear=0;
      queue[front]=root;
      node *pnode;
      while(front<=rear)
      {
            pnode=queue[front++];
            cout<<"  "<<pnode->data;
            if(pnode->left!=NULL)
                  queue[++rear]=pnode->left;
            if(pnode->right!=NULL)
                  queue[++rear]=pnode->right;
      }
}
void dfs()
{
      if(root==NULL)
      {
            cout<<"\nEMPTY LIST";
            return;
      }
      node **stack = new node*[count(root)];
      int top=0;
      stack[top]=root;
      node *pnode;
      while(top>=0)
      {
            pnode=stack[top--];
            cout<<"  "<<pnode->data;
            if(pnode->left!=NULL)
                  stack[++top]=pnode->left;
            if(pnode->right!=NULL)
                  stack[++top]=pnode->right;
      }
}

Monday, 6 August 2012

In a linked list print odd nodes first and then even nodes and also sort a linked list


#include<iostream.h>
#include<process.h>
#include<conio.h>
class node
{
public:
      node *next;
      int data;
      node()
      {
            next=NULL;
      }
}*start=NULL;
void display()
{
      if(start==NULL)
      {
            cout<<"empty list";
            return;
      }
      node *ptr=start;
      while(ptr!=NULL)
      {
            cout<<"  "<<ptr->data;
            ptr=ptr->next;
      }
}

void insert(int item)
{
      node *newnode = new node;
      newnode->data=item;
      if(start==NULL)
      {
            start=newnode;
            return;
      }
      node *ptr=start;
      while(ptr->next!=NULL)
            ptr=ptr->next;
      ptr->next=newnode;
}

void del(int item)
{
      if(start->data==item)
      {
            start=start->next;
            return;
      }
      node *pre=NULL,*ptr=start;
      while(ptr!=NULL)
      {
            if(ptr->data==item)
            {
                  pre->next=ptr->next;
                  return;
            }
            pre=ptr;
            ptr=ptr->next;
      }
      cout<<"ITEM NOT IN LIST";
}

void sort()
{
      node *min,*parmin;
      for(node *ptr1=start,*parptr1=NULL;ptr1->next!=NULL;)
      {
            min=ptr1;
            for(node *ptr2=ptr1->next,*save=ptr1;ptr2!=NULL;)
            {
                  if(ptr2->data<min->data)
                  {
                        min=ptr2;
                        parmin=save;
                  }
                  save=ptr2;
                  ptr2=ptr2->next;
            }
            if(min!=ptr1)
            {
                  parmin->next=min->next;
                  min->next=ptr1;
                  if(parptr1==NULL)
                  {
                        start=min;
                        parptr1=min;
                  }
                  else
                  {
                        parptr1->next=min;
                        parptr1=min;
                  }

            }
            else
            {
                  parptr1=ptr1;
                  ptr1=ptr1->next;
            }
      }
}
void main()
{
      clrscr();
      cout<<"1.INSERT\n2.DELETE\n3.DISPLAY\n4.ALL ODD FIRST\n";
      cout<<"5.SORT\n6.REVERSE\n7.ALTERNATE REVERSE\n8.Nth ELEMENT FROM LAST\n9.Exit\n";
      int ch,item;
      while(1)
      {
            cout<<"\nchoice? ";
            cin>>ch;
            switch(ch)
            {
                  case 1:     cout<<"ITEM TO INSERT";
                        cin>>item;
                        insert(item);
                        break;
                  case 2:     cout<<"ITEM TO DELETE";
                        cin>>item;
                        del(item);
                        break;
                  case 3:     display();
                        break;
                  case 4:// sort();
                        evenodd();
                        display();
                        break;
                  case 5: sort();
                        display();
                        break;
                  case 6: //node *ptr=reverse(start);
                        //    ptr->next=NULL;
                        i_reverse();
                        break;
                  case 7: kreverse(4);
                        //altreverse();
                        break;
                  case 8: int n;
                        cout<<" ENTER N ";
                        cin>>n;
                        fromlast(n);
                        break;
                  case 9:     exit(0);
            }
      }
}