C++广搜题目

迷宫出口

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int a[100][100];
bool b[100][100];
int n;
struct point{
	int x,y;
	point(){};
	point(int a,int b){
		x=a;
		y=b;
	}
};
point que[10000];
int head=0;
int tail=0;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	}
	int qdx;
	int qdy;
	int zdx;
	int zdy;
	cin>>qdx>>qdy>>zdx>>zdy;
	b[qdx][qdy]=1;
	que[++tail]={qdx,qdy};
	while(head<tail){
		head++;
		for(int i=0;i<4;i++){
			int tx=que[head].x+dx[i];
			int ty=que[head].y+dy[i];
			if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&b[tx][ty]==1){
				b[tx][ty]=1;
				que[++tail]={tx,ty};
			}
		}
	}
	if(b[zdx][zdy]==1){
		cout<<"YES";
	}
	else cout<<"NO";
	return 0;
}

数池塘(四方向)

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
char a[100][100];
int n,m;
struct node{
	int x,y;
	node(){x=0,y=0;}
	node(int a,int b){
		x=a;
		y=b;
	}
};
node que[10000];
int head=0;
int tail=0;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void dfs(int x,int y);
bool ifi(int x,int y);
int cnt=0;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]=='W'){
				cnt++;
				dfs(i,j);
			}
		}
	}
	
	
	cout<<cnt;
	return 0;
}
void dfs(int x,int y){
	int head=0,tail=0;
	que[++tail]={x,y};
	while(head<tail){
		head++;
		for(int i=0;i<4;i++){
			int tx=que[head].x+dx[i];
			int ty=que[head].y+dy[i];
			if(ifi(tx,ty)==true&&a[tx][ty]=='W'){
				a[tx][ty]='.';
				que[++tail]={tx,ty};
			}
		}
	}
}
bool ifi(int x,int y){
	if(x>=1&&x<=n&&y>=1&&y<=m){
		return true;
	}
	else return false;
}

走出迷宫的最少步数2

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
char a[100][100];
bool b[100][100];
int n,m;
struct point{
	int x,y;
	point(){};
	point(int a,int b){
		x=a;
		y=b;
	}
};
point que[10000];
int head=0;
int tail=0;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	int cnt=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]=='S'){
				b[i][j]=1;
				que[++tail]={i,j};
			}
		}
	}
	while(head<tail){
		head++;
		for(int i=0;i<4;i++){
			int tx=que[head].x+dx[i];
			int ty=que[head].y+dy[i];
			if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&b[tx][ty]==1&&a[tx][ty]!='#'){
				b[tx][ty]=1;
				cnt++;
				que[++tail]={tx,ty};
			}
		}
	}
	cout<<cnt;
	return 0;
}

最 小 拐 弯 路 径

小X学游泳

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
char a[100][100];
bool b[100][100];
int n,m;
struct node{
	int x,y;
	node(){x=0,y=0;}
	node(int a,int b){
		x=a;
		y=b;
	}
};
node que[10000];
int head=0;
int tail=0;
int ma=-1;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void dfs(int x,int y);
bool ifi(int x,int y);
int cnt=1;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){			
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			dfs(i,j);
		}
	}
	
	
	cout<<ma;
	return 0;
}
void dfs(int x,int y){
	int head=0,tail=0;
	que[++tail]={x,y};
	b[x][y]=1;
	while(head<tail){
		head++;
		for(int i=0;i<4;i++){
			int tx=que[head].x+dx[i];
			int ty=que[head].y+dy[i];
			if(x>=1&&x<=n&&y>=1&&y<=m&&a[tx][ty]==a[x][y]&&b[tx][ty]==0){
				b[tx][ty]=1;
				que[++tail]={tx,ty};
				cnt++;
			}
		}
	}
	ma=max(ma,cnt);
	cnt=0;
}
bool ifi(int x,int y){
	if(x>=1&&x<=n&&y>=1&&y<=m){
		return true;
	}
	else return false;
}

0 1 迷宫

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
char a[100][100];
bool b[100][100];
int n,m;
struct node{
	int x,y,v;
	node(){x=0,y=0,v=0;}
	node(int a,int b,int c){
		x=a;
		y=b;
		v=c;
	}
};
node que[10000];
int head=0;
int tail=0;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int dfs(int x,int y);
bool ifi(int x,int y);
int cnt=0;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	int ma=-1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(b[i][j]==0){
				ma=max(ma,dfs(i,j));
			}
		}
	}
	
	
	cout<<ma;
	return 0;
}
int dfs(int x,int y){
	int head=0,tail=0;
	que[++tail]={x,y,a[x][y]};
	int cnt=0;
	while(head<tail){
		head++;
		for(int i=0;i<4;i++){
			int tx=que[head].x+dx[i];
			int ty=que[head].y+dy[i];
			if(ifi(tx,ty)==true&&a[tx][ty]!=que[head].v&&b[tx][ty]==0){
				
				que[++tail]={tx,ty,a[tx][ty]};
				cnt++;
				b[tx][ty]=1;
				return cnt;
			}
		}
	}
}
bool ifi(int x,int y){
	if(x>=1&&x<=n&&y>=1&&y<=m){
		return true;
	}
	else return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值