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; }
总结:这题搞了好长时间,可以分成以下几个阶段
①、读入存储,这题因为每个节点最多只有四个邻接点,所以用一个结构体比较省空间
②、寻找出口,我是在读入的时候一起做的
③、广度搜索,查看有多少层
     应当将一个复杂的题目分成几个小步骤,分开求解
                    
                
                
            
        
浙公网安备 33010602011771号