**题目:**P1162 填涂颜色
网址: https://www.luogu.com.cn/problem/P1162
**思路:**从(0,0)这个点开始访问,这么被1包围的0是访问不到的。
**知识点:**dfs
代码:
cpp
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e5+100;
int n,m;
int a[50][50];
bool vis[50][50];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
void dfs(int x,int y)
{
vis[x][y]=true;
for(int i=0;i<=3;i++)
{
int xx=x+dx[i],yy=y+dy[i];
if(xx>=0&&x<=n+1&&yy>=0&&yy<=n+1&&!vis[xx][yy]&&a[xx][yy]==0)
{
dfs(xx,yy);
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
dfs(0,0);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]==0&&!vis[i][j])
cout<<2<<" ";
else cout<<a[i][j]<<" ";
}
cout<<'\n';
}
return 0;
}
**题目:**P1746 离开中山路
网址: https://www.luogu.com.cn/problem/P1746
**思路:**dp[x][y]代表从(sx,sy)开始走到达(x,y)的最小步数。
**知识点:**bfs
代码:
cpp
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e3+100;
int n,m;
string a[maxn];
int dp[maxn][maxn];
bool vis[maxn][maxn];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int sx,sy,tx,ty;
struct node{
int x,y,co;
};
int main(){
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
cin>>sx>>sy>>tx>>ty;
sx--;sy--;
tx--;ty--;
queue<node>q;
q.push({sx,sy,0});
vis[sx][sy]=1;
while(q.size())
{
node qr =q.front();
q.pop();
int x=qr.x,y=qr.y,co=qr.co;
dp[x][y]=co;
for(int i=0;i<=3;i++)
{
int xx=x+dx[i],yy=y+dy[i];
if(xx>=0&&xx<n&&yy>=0&&yy<n&&a[xx][yy]=='0')
{
if(!vis[xx][yy])
{
vis[xx][yy]=1;
q.push({xx,yy,co+1});
}
}
}
}
cout<<dp[tx][ty];
return 0;
}
**题目:**P1700 [USACO19OPEN] Milk Factory B
网址: https://www.luogu.com.cn/problem/P1700
**思路:**从1到n开始枚举,判断反向建边之后从i这个点开始是否能够到达n个点。
**知识点:**dfs,反向建边
代码:
cpp
#include<bits/stdc++.h>
#define ll long long
#define eb emplace_back
using namespace std;
const int maxn=1e2+100;
int n,m;
vector<int>vt[maxn];
int cnt;
void dfs(int x)
{
cnt++;
for(auto it:vt[x])
{
dfs(it);
}
}
int main(){
cin>>n;
for(int i=1;i<=n-1;i++)
{
int x,y;
cin>>x>>y;
vt[y].eb(x);
}
for(int i=1;i<=n;i++)
{
cnt=0;
dfs(i);
if(cnt==n)
{
cout<<i;
return 0;
}
}
cout<<-1;
return 0;
}