#jx1201. 深搜和广搜

深搜和广搜

一、红与黑

问题描述

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向四周相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入格式

第一行是两个整数 n 和 m,表示房间是 n 行 m 列大小(1<n,m<20)。在接下来的 n 行中,每行包括 m 个字符。每个字符表示一块瓷砖的颜色,规则如下: 1)‘.’:黑色的瓷砖; 2)‘#’:红色的瓷砖; 3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在数据中出现一次。

输出格式

一行,显示你从初始位置出发能到达的瓷砖数(注意:记数时包括初始位置的瓷砖)。

输入样例

5 6
....#.
.....#
......
#@...#
.#..#.

输出样例

21
#include<iostream>
using namespace std;
char mp[20][20];
int vis[20][20];//标记是否搜索,搜索过1 
int dx[4]={1,0,-1,0};//下右上左
int dy[4]={0,1,0,-1}; 
int n,m,ans=0;//连通块个数 
void dfs(int x,int y);
int main(){
	int sx,sy;//起点下标 
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>mp[i][j];
			if(mp[i][j]=='__(1)__'){
				sx=i;
				sy=j;
			}
		}
	}
	____(2)____;
	ans=1; 
	dfs(sx,sy);
	cout<<ans;
	return 0;
}
//深搜函数
void dfs(int x,int y){
	for(int i=0;i<4;i++){
		//计算搜索点下标
		int nx=x+dx[i];
		int ny=y+dy[i];
		//如果搜索点未越界且未被搜索过且可以走
		if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&____(3)____&&____(4)____){
			vis[nx][ny]=1;
			____(5)____;
			dfs(nx,ny);
		} 
	}
}

第 1 题

(1)处填写( ) {{ select(1) }}

  • a
  • @
  • .
  • d

第 2 题

(2)处填写( ) {{ select(2) }}

  • vis[sx][sy]=1
  • vis[sx][sy]=0
  • ans=0
  • int ans

第 3 题

(3)处填写( ) {{ select(3) }}

  • vis[nx][ny]==1
  • vis[nx][ny]==0
  • mp[nx][ny]==0
  • mp[nx][ny]==1

第 4 题

(4)处填写( ) {{ select(4) }}

  • ny<=m
  • mp[nx][ny]=='#'
  • mp[nx][ny]!='#'
  • ny>=1

第 5 题

(5)处填写( ) {{ select(5) }}

  • ans++
  • ans--
  • sx++
  • sy++

二、棋盘寻宝

问题描述

有一个n*m的棋盘(1 ≤ n,m ≤ 100),棋盘上有侍卫和宝藏,在棋盘的左上角(1,1)开始寻找宝藏,如果能避开侍卫找到宝藏输出YES,否则输出NO。 注意:左上角可能有侍卫,此题广度优先搜索解决。

输入格式

两个非零整数n和m,n表示迷阵行数,m表示迷阵列数。接下来有n行,每行包含m个符号,不同字符分别代表不同含义。 “.”:可以安全通行的方格,“#”:有守卫的方格,“*”:宝藏所在位置。

输出格式

找到宝藏输出YES,否则输出NO。

输入样例1

4 4
# . . .
. . . .
. . . *
. . . .

输出样例1

NO

输入样例2

4 4
. . . .
. # . #
. * . .
. . . .

输出样例2

YES
#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y;
};
char mp[101][101]; //地图 
int vis[101][101]={};//标记点是否被搜索过,搜过1 
queue<__(1)__> q;//队列 
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1}; 
int n,m;
//广搜函数
void bfs(){
	//1、起点入队
	node a={1,1};
	q.push(a); 
	vis[1][1]=1;//标记1,1点被搜索过
	while(___(3)____){//队列不为空 
		//2、获取队首元素,判断是否是宝藏 
		node f=q.front();
		if(mp[f.x][f.y]=='*'){
			cout<<"YES";
			return;//退出函数 
		} 
		//3、不是宝藏 ,相邻元素入队
		for(int i=0;i<4;i++){
			int nx=f.x+dx[i];
			int ny=f.y+dy[i];
			//如果没越界且不是障碍物且没被搜索过,可以入队
			if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&mp[nx][ny]!='#'&&vis[nx][ny]==0){
				vis[nx][ny]=1;//标记被搜索过
				___(4)____;
				q.push(r);//入队 
			} 
		} 
		//4、队首出队
		q.pop(); 
	} 
	___(5)___; 
} 
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>mp[i][j];
		}
	}
	//判断起点是否是守卫
	if(___(2)___){
		cout<<"NO";
		return 0;
	} 
	bfs();
	return 0;
}

第 6 题

(1)处填写( ) {{ select(6) }}

  • int
  • node
  • char
  • double

第 7 题

(2)处填写( ) {{ select(7) }}

  • mp[1][1]=='.'
  • mp[1][1]=='*'
  • mp[1][1]=='#'
  • mp[1][1]==0

第 8 题

(3)处填写( ) {{ select(8) }}

  • q.empty()!=1
  • a
  • true
  • false

第 9 题

(4)处填写( ) {{ select(9) }}

  • node r=nx,ny
  • node r=nx+1,ny+1
  • node r={nx+1,ny+1}
  • node r={nx,ny}

第 10 题

(5)处填写( ) {{ select(10) }}

  • cout<<"YES"
  • cout<<"NO"
  • q.pop()
  • q.empty()