练习题
1.深度优先搜索 (DFS)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int W,H;
char array[25][25];
int book[25][25];
int sum;
int place[4][2]={0,1,1,0,0,-1,-1,0};
void dfs(int x,int y){
book[x][y]=1;
for(int i=0;i<4;i++){
int tx=x+place[i][0];
int ty=y+place[i][1];
if(tx<0||tx>=H||ty<0||ty>=W||book[tx][ty]==1||array[tx][ty]=='#')
continue;
if(book[tx][ty]==0&&array[tx][ty]=='.'){
sum++;
dfs(tx,ty);
}
}
}
int main(){
cin>>W>>H;
while(W!=0&&H!=0){
int a,b;
sum=1;
for(int i=0;i<H;i++)
for(int j=0;j<W;j++){
cin>>array[i][j];
}
for(int i=0;i<H;i++)
for(int j=0;j<W;j++)
if(array[i][j]=='@'){
a=i;
b=j;
}
memset(book,0,sizeof(book));
dfs(a,b);
cout<<sum<<endl;
cin>>W>>H;
}
return 0;
}
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int W,H;
int sum;
char array[105][105];
int book[105][105];
int place[4][2]={0,1,1,0,0,-1,-1,0};
void dfs(int x,int y,char t){
book[x][y]=1;
for(int i=0;i<4;i++){
int tx=x+place[i][0];
int ty=y+place[i][1];
if(tx<0||tx>=H||ty<0||ty>=W||book[tx][ty]==1)
continue;
if(book[tx][ty]==0&&array[tx][ty]==t){
dfs(tx,ty,t);
}
}
}
int main(){
cin>>H>>W;
while(W!=0&&H!=0){
memset(book,0,sizeof(book));
sum=0;
int a,b;
for(int i=0;i<H;i++)
for(int j=0;j<W;j++){
cin>>array[i][j];
}
for(int i=0;i<H;i++)
for(int j=0;j<W;j++)
if(book[i][j]==0){
dfs(i,j,array[i][j]);
sum++;
}
cout<<sum<<endl;
cin>>H>>W;
}
return 0;
}
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[11];
bool dfs(int i,int l,int r){
if(i==10)return true;
if(dfs(i+1,a[i],r)&&a[i]>l)return true;
if(dfs(i+1,l,a[i])&&a[i]>r)return true;
return false;
}
int main(){
int T;
cin>>T;
while(T--){
for(int i=0;i<10;i++)
cin>>a[i];
if(dfs(0,0,0))cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
2.广度优先搜索 (BFS)
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int H,W,N,sum=0;
char array[1005][1005];
int book[1005][1005];
int price[4][2]={0,1,1,0,0,-1,-1,0};
int a,b,c,d;
struct node
{
int x;
int y;
int time;
}st;
queue<node> q;
bool bfs(){
memset(book,0,sizeof(book));
book[a][b]=1;
while(!q.empty()){
q.pop();
}
st.x=a;
st.y=b;
st.time=0;
q.push(st);
node v1;
int tx,ty;
while(!q.empty()){
v1=q.front();
q.pop();
for(int i=0;i<4;i++){
tx=v1.x+price[i][0];
ty=v1.y+price[i][1];
if(tx<0||tx>=H||ty<0||ty>=W||array[tx][ty]=='X'||book[tx][ty]==1)
continue;
book[tx][ty]=1;
st.x=tx;
st.y=ty;
st.time=v1.time+1;
q.push(st);
if(tx==c&&ty==d){
return true;
}
}
}
}
int main(){
node v2;
cin>>H>>W>>N;
for(int i=0;i<H;i++)
for(int j=0;j<W;j++)
cin>>array[i][j];
for(int i=0;i<H;i++)
for(int j=0;j<W;j++)
if(array[i][j]=='S'){
a=i;
b=j;
}
for(int k=0;k<N;k++)
for(int i=0;i<H;i++)
for(int j=0;j<W;j++){
if(array[i][j]=='1'+k){
c=i;
d=j;
if(bfs()){
v2=q.back();
sum+=v2.time;
}
a=c;
b=d;
}
}
cout<<sum<<endl;
return 0;
}