大白书第二章练习题

练习题

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初始化 
   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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值