All pastes #473464 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-05-06 07:49 UTC
rendered paste body
#include<iostream>
using namespace std;
#define MAX 1002
struct ADD_LIST
{
    int f_row,f_col,t_row,t_col;
};
struct BFS_LIST
{
    int row,col,index;    
};
BFS_LIST bfs_start,bfs_temp,bfs_next,bfs_end,bfs[100000];
ADD_LIST add_start,add_temp,add_next,add[100000];        
int n,m,start_row,start_col,wall,add_count,answer_count=0,target_row,target_col,bfs_cnt=0;
int from_row,from_col,to_row,to_col,array[MAX][MAX],answer[100000],target_count,add_cnt=0,in=0;
void add_path(void)
{
    scanf("%d",&add_count);
    for(int i=0;i<add_count;i++)
    {
        scanf("%d %d %d %d",&from_row,&from_col,&to_row,&to_col);
        
        
        add_start=add[0];
        add[add_cnt].f_row=from_row;
        add[add_cnt].f_col=from_col;
        
        add[add_cnt].t_row=to_row;
        add[add_cnt++].t_col=to_col;        
        
        array[from_row][from_col]=2;
    }   
}
int main()
{
    scanf("%d",&n);
    scanf("%d",&m);
    scanf("%d",&start_row);
    scanf("%d",&start_col);
    
    bfs[bfs_cnt].index=-1;
    bfs[bfs_cnt].row=start_row;
    bfs[bfs_cnt++].col=start_col;
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
           scanf("%d",&array[i][j]);
    
    add_path();
    
    scanf("%d",&target_count);
    for(int i=0;i<target_count;i++)
    {
        scanf("%d",&target_row);
        scanf("%d",&target_col);
        array[target_row][target_col]=3;
    }    
    
    int flag=0;
    bfs_next=bfs_end=bfs[0];
 
    int end_cnt=0,end_cnt1;
    while(end_cnt!=bfs_cnt)
    {
        bfs_next=bfs[end_cnt];
        if(array[bfs_next.row][bfs_next.col]==3)
        {
            end_cnt1=bfs_next.index;
            answer[answer_count++]=bfs_next.col;
            answer[answer_count++]=bfs_next.row;
            while(end_cnt1!=-1)
            {
                answer[answer_count++]=bfs[end_cnt1].col;
                answer[answer_count++]=bfs[end_cnt1].row;
                end_cnt1=bfs[end_cnt1].index;
            }   
            flag=1;
            break;
        }
        int ff=0;
        if(array[bfs_next.row][bfs_next.col]==2)
        {
            ff=1;
            array[bfs_next.row][bfs_next.col]=1;
            end_cnt1=0;
            while(end_cnt1!=add_cnt)
            {
                if((add[end_cnt1].f_row==bfs_next.row)&&(add[end_cnt1].f_col==bfs_next.col))
                {
                    bfs[bfs_cnt].row=add[end_cnt1].t_row;
                    bfs[bfs_cnt].col=add[end_cnt1].t_col;
                    bfs[bfs_cnt++].index=in;
                }
                end_cnt1++;
            }
        }
        if((array[bfs_next.row][bfs_next.col]==0)||(ff==1))
        {
            array[bfs_next.row][bfs_next.col]=1;
            if(bfs_next.row-1>0)
            {
                if(array[bfs_next.row-1][bfs_next.col]!=1)
                {
                    bfs[bfs_cnt].row=bfs_next.row-1;
                    bfs[bfs_cnt].col=bfs_next.col;
                    bfs[bfs_cnt++].index=in;
                }
            } 
            if(bfs_next.row+1<=n)
            {
                if(array[bfs_next.row+1][bfs_next.col]!=1)
                {
                    bfs[bfs_cnt].row=bfs_next.row+1;
                    bfs[bfs_cnt].col=bfs_next.col;
                    bfs[bfs_cnt++].index=in;
                }
            }
            if(bfs_next.col+1<=m)
            {
                if(array[bfs_next.row][bfs_next.col+1]!=1)
                {
                    bfs[bfs_cnt].row=bfs_next.row;
                    bfs[bfs_cnt].col=bfs_next.col+1;
                    bfs[bfs_cnt++].index=in;
                }
            }
            if(bfs_next.col-1>0)
            {
                if(array[bfs_next.row][bfs_next.col-1]!=1)
                {
                    bfs[bfs_cnt].row=bfs_next.row;
                    bfs[bfs_cnt].col=bfs_next.col-1;
                    bfs[bfs_cnt++].index=in;
                }
            }
        }
        end_cnt++;
        in++;
     }    
     if(flag==1)
     {
         bool val=true;
         cout<<endl<<(answer_count>>1)<<endl;
         for(int i=answer_count-1;i>=0;i--)
         {
              if(val==true)
                   cout<<answer[i]<<" ";
              else
                   cout<<answer[i]<<endl;
              val=!val;
         }    
     }
     else
          cout<<"Impossible"; 
}