Lightoj 1066 Gathering Food (bfs)
//题意:自己看
//思路:bfs
//此题的坑为:摘过的食物就会变成‘.',也就是说还可以走
//方法:每走到一个新的食物时,把这里看成新的起点,visit清0,此点visit为1
//注意:A点要首先变为'.';
自己样例
3
A..
.C#
..B
6
3
A.C
B#.
###
4
#include <cstdio> #include <algorithm> #include <iostream> #include <queue> #include <cstring> using namespace std; char data[12][12]; int ki,kj,si,sj,n; int visit[12][12]; int to[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; struct node { int x,y; int step; char a; }; int go(int i,int j) { if(i>=1&&i<=n&&j>=1&&j<=n&&data[i][j]!='#') return 1; return 0; } int bfs() { node st,ed; queue <node> q; st.x=ki; st.y=kj; st.step=0; st.a='A'; memset(visit,0,sizeof(visit)); visit[ki][kj]=1; data[ki][kj]='.'; q.push(st); while(!q.empty()) { st=q.front(); q.pop(); if(st.x==si&&st.y==sj) { cout<<st.step<<endl; return 0; } for(int i=0;i<4;i++) { ed.x=st.x+to[i][0]; ed.y=st.y+to[i][1]; if(go(ed.x,ed.y)&&visit[ed.x][ed.y]==0) { if((int)(st.a)+1==(int)data[ed.x][ed.y]) { ed.step=st.step+1; ed.a=data[ed.x][ed.y]; data[ed.x][ed.y]='.'; memset(visit,0,sizeof(visit)); visit[ed.x][ed.y]=1; while(!q.empty()) q.pop(); q.push(ed); break; } else if(data[ed.x][ed.y]=='.') { visit[ed.x][ed.y]=1; ed.step=st.step+1; ed.a=st.a; q.push(ed); } } } } cout<<"Impossible"<<endl; return 0; } int main() { int t,k=0; cin>>t; while(t--) { cin>>n; k++; char max='A'; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { cin>>data[i][j]; if(data[i][j]=='A') { ki=i;kj=j; } if(data[i][j]<='Z'&&data[i][j]>='A'&&data[i][j]>max) { si=i;sj=j; max=data[i][j]; } } if(max=='A') { cout<<"Case "<<k<<": 0"<<endl; continue; } cout<<"Case "<<k<<": "; bfs(); } return 0; }
你若是天才,我便是疯子