关于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;
}