关于DFS和BFS的内容,大家还没有学习,参加初赛的同学,可以先通过阅读这些模板题的代码,对搜索有一个基本的认识。

2094: 扫地机器人

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[11][11];
void dfs(int x,int y,int k,int n,int m){
    if(x>0&&x<n+1&&y>0&&y<m+1&&a[x][y]==0){
        a[x][y]=k;
        dfs(x,y+1,k+1,n,m);
        dfs(x+1,y,k+1,n,m);
        dfs(x,y-1,k+1,n,m);
        dfs(x-1,y,k+1,n,m);
    }
}
int main(){
    cin>>n>>m;
    dfs(1,1,1,n,m);
    for (int i = 1; i < n+1; i++) {
        for (int j = 1; j < m+1; j++) {
            cout<<setw(3)<<a[i][j];
        }
        cout<<endl;
    }
}

2095: 自然数的拆分

#include<bits/stdc++.h> 
using namespace std;
int a[25];
int num;
void dfs(int n,int m){//拆分n,拆分成m个数
        if(a[m-1]>n)return;
        for(int i=a[m-1];i<=n;i++)
        {
            n-=i;
            a[m]=i;
            if(!n&&i!=num)
            {
                printf("%d=",num);
                for(int j=1;j<m;j++)
                    printf("%d+",a[j]);
                cout<<i<<endl;
                return;
            }
            else dfs(n,m+1);
            n+=i;//回溯
        }     
}
int main()
{
    a[0]=1;
    cin>>num; 
    dfs(num,1);
    return 0;
}

2038: 按字典序输出所有匹配的圆括号对

#include<iostream>
using namespace std;
char a[100];
int n;
void dfs(int k,int l,int r){
	int i,j;
	if(k==2*n){
		for(i=1;i<=n*2;i++)
		cout<<a[i];
		cout<<endl;
	}
	else{
		if(l<n){
			a[k+1]='(';
			dfs(k+1,l+1,r);
		}
		if(r<n&&r<l){
			a[k+1]=')';
			dfs(k+1,l,r+1);
		}
	}
}
int main(){
	cin>>n;
	dfs(0,0,0);
	return 0;
}

2037: 解救小哈【迷宫问题】

#include<bits/stdc++.h>
using namespace std;
int a[100][100],v[100][100];
struct point
{
	int x;
	int y;
	int step;//步数 
};

queue<point> r;//申请队列 
//定义4个方向的数组 右下左上 
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};;
int main()
{
	int n,m,startx,starty,p,q;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
		} 	
	}
	//输入起点坐标信息
	cin>>startx>>starty>>p>>q; 
	//bfs
	point start;//起点
	start.x=startx;
	start.y=starty;
	start.step=0;
	//起点入队
	r.push(start);
	v[startx][starty]=1;
	int flag=0;
	//当队列不为空时,进行操作 
	while(!r.empty()){
		int x=r.front().x;
		int y=r.front().y;
		if(x==p&&y==q){
			flag=1;
			//输出队首元素的步数 
			cout<<r.front().step;
			break;
		} 
		for(int k=0;k<=3;k++)
		{
			int tx,ty;//设置扩展点 
			tx=x+dx[k];
			ty=y+dy[k];
			//如果是空地,并且未访问
			if(a[tx][ty]==1&&v[tx][ty]==0)
			{
				//入队
				point tp;
				tp.x=tx;
				tp.y=ty;
				tp.step=r.front().step+1;
				r.push(tp);
				v[tx][ty]=1;//将该点设为已访问 
			 } 
		 } 
		 r.pop();//出队 拓展完了需要将队首出队 
	} 
	if(flag==0){
		cout<<"no answer!";
	} 
	return 0;
 }