2.-4 overfencing

题目:http://ace.delos.com/usacoprob2?a=JLwu8ZOtbGJ&S=maze1

        http://www.nocow.cn/index.php/Translate:USACO/maze1

 

#include<iostream>
#include<fstream>
#include<queue>

using namespace std;

struct Node
{
       int num;
       int link[4];
};

int main()
{
    //ifstream fin("1.txt");
    //ofstream fout("2.txt");
    ifstream fin("maze1.in");
    ofstream fout("maze1.out");
    
    int i,j,k,exit[2],exitNum=0;
    int H,W,total,d[3800],longest;
    char t;
    Node m[3801];
    
    fin>>W>>H;
    
    if(W==1&&H==1)
    {
       fout<<1<<endl;
       return 0;
    }
    total=H*W;
    
    for(i=0;i<total+1;i++)
        m[i].num=0;
    
    //input
    t=fin.get();
    for(i=0;i<H;i++)
    {
        for(j=0;j<W;j++)
        {
           fin.get();
           t=fin.get();
           if(t==' ')
             if(i!=0) //1
             {
                 k=i*W+j;
                 //
                 m[k].link[m[k].num++]=k-W;
                 m[k-W].link[m[k-W].num++]=k;
             } 
             else
             {
                 exit[exitNum++]=j;
             }
        }
        fin.get();
        fin.get();
        for(j=0;j<W;j++)
        {
            t=fin.get();
            if(t==' ')
               if(j!=0)
               {
                   k=i*W+j;
                   //
                   m[k].link[m[k].num++]=k-1;
                   m[k-1].link[m[k-1].num++]=k;
               }
               else
                   exit[exitNum++]=i*W;
            fin.get();
        }
        //最后一列========================== 
        t=fin.get();                      // 
        if(t==' ')                        //
           exit[exitNum++]=(i+1)*W-1;     //
        fin.get();                        //
        //==================================
    }
    
    //最后一行===========
    if(exitNum<2)      //
       for(i=0;i<W;i++)//
       {               //
            fin.get(); //
            t=fin.get();//
            if(t==' ')  //
               exit[exitNum++]=total-W+i;
       }                //
    //===================
    
    //compute
    for(i=0;i<total;i++)
       d[i]=0;
    
    longest=0;
    queue<int> q;
    int flag,temp;
    q.push(exit[0]);
    q.push(exit[1]);
    d[exit[0]]=1;
    d[exit[1]]=1;
    flag=exit[1];
    
    while(!q.empty())
    {
       temp=q.front();
       q.pop();
       for(i=0;i<m[temp].num;i++)
          if(d[m[temp].link[i]]==0)
            {
               q.push(m[temp].link[i]);
               d[m[temp].link[i]]=1;
            }
       if(temp==flag)
       {
         flag=q.back();
         longest++;
       }
    }
    
    //output
    
    fout<<longest<<endl;
    
    //show
    /*
    fout<<exit[0]<<" "<<exit[1]<<endl<<endl;
    for(i=0;i<total;i++)
    {
       fout<<i<<":"<<m[i].num<<"→"; 
       for(j=0;j<m[i].num;j++)
          fout<<m[i].link[j]<<" ";
          fout<<endl;
    }*/
    

    return 0;
}

总结:这题搞了好长时间,可以分成以下几个阶段

①、读入存储,这题因为每个节点最多只有四个邻接点,所以用一个结构体比较省空间

②、寻找出口,我是在读入的时候一起做的

③、广度搜索,查看有多少层

     应当将一个复杂的题目分成几个小步骤,分开求解

posted @ 2012-04-24 15:06  无殇天下  阅读(116)  评论(0)    收藏  举报