P1162 填涂颜色

bfs大致思路就是先把起始点放入队列中,这道题从四周的0为起点,并设置一个标记函数,最后遍历就行
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=35;
int n,g[N][N],visited[N][N];
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
void bfs(){
queue<pair<int,int>> q;
for(int i=1;i<=n;i++){
if(g[1][i]==0){
q.push({1,i});
visited[1][i]=1;
}
if(g[n][i]==0){
q.push({n,i});
visited[n][i]=1;
}
if(g[i][1]==0){
q.push({i,1});
visited[i][1]=1;
}
if(g[i][n]==0){
q.push({i,n});
visited[i][n]=1;
}
}
while(!q.empty()){
auto [x,y]=q.front();
q.pop();
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx<1||ny<1||nx>n||ny>n) continue;
if(g[nx][ny]==1||visited[nx][ny]) continue;
visited[nx][ny]=1;
q.push({nx,ny});
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>g[i][j];
bfs();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(g[i][j]==0&&!visited[i][j]) cout<<"2 ";
else cout<<g[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
P1135 奇怪的电梯

cpp
#include<bits/stdc++.h>
using namespace std;
const int N = 205;
int n, a, b;
int g[N];
bool visited[N];
int bfs(){
queue<pair<int,int>> q;
q.push({a, 0});
visited[a]=true;
while(!q.empty()){
auto [floor, steps]=q.front();
q.pop();
if(floor==b){
return steps;
}
int up=floor+g[floor];
if(up<=n&&!visited[up]){
visited[up]=true;
q.push({up,steps+1});
}
int down=floor-g[floor];
if(down>=1&&!visited[down]){
visited[down] =true;
q.push({down,steps+1});
}
}
return -1;
}
int main() {
cin>>n>>a>>b;
for(int i=1;i<=n;i++) {
cin>>g[i];
}
int result=bfs();
cout<<result<<endl;
return 0;
}