深度优先搜索:
第一题:POJ1979Red and Black http://poj.org/problem?id=1979
题意:在一个W*H的矩形中,每个单位的格子是红色或是黑色的,'@'是初始位置,'.'是黑色的格子',#'是红色的格子,给出地图,要求输出从初始位置通过黑色的格子可以到达的所有位置的总数。
代码: #include<iostream> using namespace std; char map[21][21]; int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; int sum,W,H; void DFS(int x,int y) { ++sum; map[x][y]='@'; int newx,newy; for(int i=0;i<4;i++) { newx=x+dir[i][0]; newy=y+dir[i][1]; if(newx>=0&&newx<H&&newy>=0&&newy<W&&map[newx][newy]=='.') DFS(newx,newy); } } int main() { int x,y; while(cin>>W>>H&&W!=0&&H!=0){ sum=0; for(int i=0;i<H;i++) for(int j=0;j<W;j++) { cin>>map[i][j]; if(map[i][j]=='@') { x=i;y=j; } } DFS(x,y); cout<<sum<<endl; } }
第二题:AOJ 0118 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0118
题意:在H * W的矩形果园里有苹果、梨、蜜柑三种果树, 相邻(上下左右)的同种果树属于同一个区域,给出果园的果树分布,求总共有多少个区域。(原题的样图中苹果为リ,梨为カ,蜜柑为ミ, 图中共10个区域) 输入:多组数据,每组数据第一行为两个整数H、W(H <= 100, W <= 100), H =0 且 W = 0代表输入结束。以下H行W列表示果园的果树分布, 苹果是@,梨是#, 蜜柑是*。 输出:对于每组数据,输出其区域的个数。
代码: #include<iostream> using namespace std; int W,H; char map[101][101]; int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; void DFS(int x,int y,char ch) { map[x][y]='.'; int newx,newy; for(int i=0;i<4;i++) { newx=dir[i][0]+x; newy=dir[i][1]+y; if(newx>=0&&newx<H&&newy>=0&&newy<W&&map[newx][newy]==ch) DFS(newx,newy,ch); } } int main() { int count; char ch; while(cin>>H>>W&&W!=0&&H!=0) { count=0; for(int i=0;i<H;i++) for(int j=0;j<W;j++) cin>>map[i][j]; for(int i=0;i<H;i++) for(int j=0;j<W;j++) { ch=map[i][j]; if(ch!='.') { count++; DFS(i,j,ch); } } cout<<count<<endl; } }
代码: #include<iostream> #include<memory.h> using namespace std; int arr[10],used[10]; void DFS(int pre,int cur) { if(cur<10&&arr[pre]<arr[cur]) { used[cur]=1; DFS(cur,cur+1); } else if(cur<10&&arr[pre]>=arr[cur]) DFS(pre,cur+1); } int main() { int T,pre; bool judge; cin>>T; while(T--) { for(int i=0;i<10;i++) cin>>arr[i]; for(int i=0;i<10;i++) { memset(used,0,sizeof(used)); used[i]=1; DFS(i,i+1); judge=false; pre=0; for(int j=0;j<10;j++) if(used[j]==0) if(pre>=arr[j]) { judge=true; break; }else pre=arr[j]; if(!judge) { cout<<"YES"<<endl; break; } } if(judge)cout<<"NO"<<endl; } }
代码: #include<iostream> using namespace std; int W,H,arr[21][21]; int Min,dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; void DFS(int x,int y,int step) { if(step>10) return; int newx,newy; for(int i=0;i<4;i++) { newx=x+dir[i][0]; newy=y+dir[i][1]; if(!(newx>=0&&newx<H&&newy>=0&&newy<W)||arr[newx][newy]==1) continue; while(arr[newx][newy]==0) { newx+=dir[i][0]; newy+=dir[i][1]; } // cout<<newx<<" "<<newy<<endl; if(newx>=0&&newx<H&&newy>=0&&newy<W) { if(arr[newx][newy]==1) { arr[newx][newy]=0; newx-=dir[i][0]; newy-=dir[i][1]; DFS(newx,newy,step+1); arr[newx+dir[i][0]][newy+dir[i][1]]=1; } else if(arr[newx][newy]==3) { Min=Min>step?step:Min; } } } } int main() { int startx,starty; while(cin>>W>>H&&W!=0&&H!=0) { Min=11; for(int i=0;i<H;i++) for(int j=0;j<W;j++) { cin>>arr[i][j]; if(arr[i][j]==2) { arr[i][j]=0; startx=i;starty=j; } } DFS(startx,starty,1); if(Min>10) cout<<"-1"<<endl; else cout<<Min<<endl; } }