BFS DFS 记忆化搜索 剪枝——普及

P1036 [NOIP2002 普及组] 选数

P1036 [NOIP2002 普及组] 选数https://www.luogu.com.cn/problem/P1036

#include
using namespace std;
int n,k,s[50],ans;
bool prime(int x)
{
	for(int i=2;i*i<=x;i++)
		if(x%i==0) 
            return false;
	return true;
}
void dfs(int m,int sum,int step)
{
	if(m==k) 
	{	
		if(prime(sum))	
            ans++;
		return;
	}
	for(int i=step;i<=n;i++)
		dfs(m+1,sum+s[i],i+1);
	return;
}
int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++) 
		cin>>s[i];
    dfs(0,0,1);
    cout<

P1460 [USACO2.1]健康的荷斯坦奶牛 Healthy Holsteins

P1460 [USACO2.1]健康的荷斯坦奶牛 Healthy Holsteinshttps://www.luogu.com.cn/problem/P1460

#include
using namespace std;
int v,w[1010],g,s[1010][1010],ans[1010],z[1010],minn=0x3f3f3f3f;
bool pd(int x)
{
	for(int i=1;i<=v;i++)
	{
		int tt=0;
		for(int j=1;j<=x;j++)
			tt+=s[z[j]][i];
		if(ttg)
	{
		if(pd(m)&&minn>m)
		{
			minn=m;
			for(int i=1;i<=minn;i++)
				ans[i]=z[i];
		}
		return;
	}
	z[m+1]=n;
	dfs(n+1,m+1);//搜索
	dfs(n+1,m);//回溯,如果不选第t种饲料的操作
}
int main()
{
    cin>>v;
    for(int i=1;i<=v;i++)
    	cin>>w[i];
    cin>>g;
    for(int i=1;i<=g;i++)
    	for(int j=1;j<=v;j++)
    		cin>>s[i][j];
    dfs(1,0);
    cout<

P9011 [USACO23JAN] Air Cownditioning II B

P9011 [USACO23JAN] Air Cownditioning II Bhttps://www.luogu.com.cn/problem/P9011

#include
using namespace std;
int n,m,s,t,c,x[200],a[200],b[200],p[200],mm[200],minn=0x3f3f3f3f;
bool pd()
{
	for(int i=1;i<=100;i++)
		if(x[i]>0) 
            return false;
	return true;
}
void dfs(int k,int sum)
{
	if(k==m+1)
	{
		if(pd())
			minn=min(minn,sum);
		return;
	}
	dfs(k+1,sum);//不选
	for(int i=a[k];i<=b[k];i++)
		x[i]-=p[k];
	dfs(k+1,sum+mm[k]);//选
	for(int i=a[k];i<=b[k];i++)//回溯
		x[i]+=p[k];
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
    	cin>>s>>t>>c;
    	for(int j=s;j<=t;j++)
    		x[j]=c;
	}
	for(int i=1;i<=m;i++)
		cin>>a[i]>>b[i]>>p[i]>>mm[i];
	dfs(1,0);
	cout<

P8605 [蓝桥杯 2013 国 AC] 网络寻路

P8605 [蓝桥杯 2013 国 AC] 网络寻路https://www.luogu.com.cn/problem/P8605

#include
using namespace std;
long long n,m,ans,pos,x,y;
vector v[100010];
bool vis[10010];
void dfs(long long u,long long step)
{
	if(step==4) 
        ans++;
	else
	{
		for(int i=0;i>n>>m;
	for(long long i=1;i<=m;i++)
	{
		cin>>x>>y;
		v[x].push_back(y);
        v[y].push_back(x);
	}
	for(int i=1;i<=n;i++)
	{
		vis[i]=1;
		dfs(pos=i,1);
		vis[i]=0;
	}
	cout<

P1596 [USACO10OCT]Lake Counting S

P1596 [USACO10OCT]Lake Counting Shttps://www.luogu.com.cn/problem/P1596

#include
using namespace std;
int n,m,ans;
int dx[]={0,1,1,1,0,-1,-1,-1},dy[]={1,1,0,-1,-1,-1,0,1};
char mp[110][110];
void dfs(int x,int y)
{
	mp[x][y]='.';
	for(int i=0;i<8;i++)
		if(mp[x+dx[i]][y+dy[i]]=='W')
			dfs(x+dx[i],y+dy[i]);
	return;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++)
    		cin>>mp[i][j];
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++)
    		if(mp[i][j]=='W')
    			dfs(i,j),ans++;
    cout<
#include
using namespace std;
int n,m,ans;
int dx[]={0,1,1,1,0,-1,-1,-1},dy[]={1,1,0,-1,-1,-1,0,1};
char mp[110][110];
void bfs(int x,int y)
{
	queue> q;
	q.push(make_pair(x,y));
	mp[x][y]='.';
	while(!q.empty())
	{
		int xx=q.front().first,yy=q.front().second;
		q.pop();
		for(int i=0;i<8;i++)
		{
			int nx=xx+dx[i],ny=yy+dy[i];
			if(nx<1||ny<1||nx>n||ny>m||mp[nx][ny]=='.') 
                continue;
			mp[nx][ny]='.';
			q.push(make_pair(nx,ny));
		}
	}
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++)
    		cin>>mp[i][j];
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++)
    		if(mp[i][j]=='W')
    			bfs(i,j),ans++;
    cout<

P1451 求细胞数量

P1451 求细胞数量https://www.luogu.com.cn/problem/P1451

#include
using namespace std;
int n,m,mp[110][110],ans;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
void dfs(int x,int y)
{
	mp[x][y]=0;
	for(int i=0;i<4;i++)
	{
		int xx=x+dx[i],yy=y+dy[i];
		if(xx>0&&yy>0&&xx<=n&&yy<=m&&mp[xx][yy]!=0)
			dfs(xx,yy);
	}
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++)
    		scanf("%1d",&mp[i][j]);
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++)
    		if(mp[i][j]!=0)
    			dfs(i,j),ans++;
    cout<
#include
using namespace std;
int n,m,mp[110][110],ans;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
void bfs(int x,int y)
{
	queue> q;
	q.push(make_pair(x,y));
	mp[x][y]=0;
	while(!q.empty())
	{
		int xx=q.front().first,yy=q.front().second;
		q.pop();
		for(int i=0;i<4;i++)
		{
			int nx=xx+dx[i],ny=yy+dy[i];
			if(nx<1||ny<1||nx>n||ny>m||mp[nx][ny]==0) 
                continue;
			mp[nx][ny]=0;
			q.push(make_pair(nx,ny));
		}
	}
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++)
    		scanf("%1d",&mp[i][j]);
    for(int i=1;i<=n;i++)
    	for(int j=1;j<=m;j++)
    		if(mp[i][j]!=0)
    			bfs(i,j),ans++;
    cout<

P1162 填涂颜色

P1162 填涂颜色https://www.luogu.com.cn/problem/P1162

#include
using namespace std;
int n,mp[50][50];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
void dfs(int x,int y)
{
	if(x<0||x>n+1||y<0||y>n+1||mp[x][y]!=0) 
        return;
	mp[x][y]=3;
	for(int i=0;i<4;i++) 
        dfs(x+dx[i],y+dy[i]);
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>mp[i][j];
	dfs(0,0);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(mp[i][j]==3) cout<<0<<" ";
			else if(mp[i][j]==0) cout<<2<<" ";
			else cout<<1<<" ";
		}
		cout<

P8604 [蓝桥杯 2013 国 C] 危险系数

P8604 [蓝桥杯 2013 国 C] 危险系数https://www.luogu.com.cn/problem/P8604

#include
using namespace std;
int n,m,u,v,x,y,ans;
int road1[4000][4000],road2[4000][4000];
bool dfs(int pos)
{
	queue q;
	q.push(x);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			road2[i][j]=road1[i][j];//存储原矩阵
	while(!q.empty())
	{
        int p=q.front();
		for(int i=1;i<=n;i++)
        {
			if(road2[p][i]&&i!=pos&&p!=pos)//连通且不含pos
			{
                if(i==y) 
                    return 0;
				road2[p][i]=0;
				road2[i][p]=0;
				q.push(i);
			}
        }
		q.pop();
	}
	return 1;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v;
		road1[u][v]=1;
		road1[v][u]=1;
	}
	cin>>x>>y;
	if(dfs(0)==1)//两点不连通
	{
		cout<<"-1";
		return 0;
	}
	for(int i=1;i<=n;i++)//枚举关键点
		if(i!=x&&i!=y)
			if(dfs(i)) 
                ans++;
	cout<

P6183 [USACO10MAR] The Rock Game S

P6183 [USACO10MAR] The Rock Game Shttps://www.luogu.com.cn/problem/P6183

#include
using namespace std;
int n,vis[1<<20],a[1<<20],ans[1<<20][20];
void print()
{
	for(int i=1;i<=1<>n;
	for(int i=1;i<=n;i++) 
        cout<<'O';
	cout<

P1506 拯救oibh总部

P1506 拯救oibh总部https://www.luogu.com.cn/problem/P1506

#include
using namespace std;
int n,m,ans;
int mp[550][550],dx[]={0,1,0,-1},dy[]={1,0,-1,0};
char c;
void dfs(int x,int y)
{
	if(x<0||x>n+1||y<0||y>m+1||mp[x][y]) 
        return;
	mp[x][y]=1;
	for(int i=0;i<4;i++)
		dfs(x+dx[i],y+dy[i]);
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
    {
		for(int j=1;j<=m;j++)
		{
			cin>>c;
			mp[i][j]=(c=='0'?0:1);
		}
    }
	dfs(0,0);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(!mp[i][j])
				ans++;
	cout<

P2802 回家

P2802 回家https://www.luogu.com.cn/problem/P2802

#include
using namespace std;
struct node
{
	int x,y,step,HP;
};
int n,m,mp[10][10];
int vis[10][10],dx[]={0,1,0,-1},dy[]={1,0,-1,0};
queue q;
void bfs()//当小H的HP为1时我们即可判定小H已经死亡。
{
	while(!q.empty())
	{
		int x=q.front().x,y=q.front().y,k=q.front().step,hp=q.front().HP;
		q.pop();
		if(mp[x][y]==3)
		{
			cout<1)
		{
			for(int i=0;i<4;i++)
			{
				int xx=x+dx[i],yy=y+dy[i];
				if(xx<1||xx>n||yy<1||yy>m) 
                    continue;//边界
				if((mp[xx][yy]==1||mp[xx][yy]==3)&&vis[xx][yy]>n>>m;
	for(int i=1;i<=n;i++)
    {
		for(int j=1;j<=m;j++)
		{
			cin>>mp[i][j];
			if(mp[i][j]==2) 
                q.push(node{i,j,0,6});
		}
    }
	bfs();
	cout<<"-1";//无解
}

P8662 [蓝桥杯 2018 省 AB] 全球变暖

P8662 [蓝桥杯 2018 省 AB] 全球变暖https://www.luogu.com.cn/problem/P8662

#include
using namespace std;
int n,cnt,sum,ans,t;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
char mp[1010][1010];
void dfs(int x,int y)
{
	if(!t)
	{
		cnt=0;
		for(int i=0;i<4;i++)
			if(mp[x+dx[i]][y+dy[i]]!='.') 	
                cnt++;
		if(cnt==4)
			ans++,t=1;
	}
	mp[x][y]='*';
	for(int i=0;i<4;i++)
	{
		int xx=x+dx[i],yy=y+dy[i];
		if(xx<0||xx>=n||yy<0||yy>=n||mp[xx][yy]!='#') 
            continue;
		dfs(xx,yy);
	}
}
int main()
{
	cin>>n;
	for(int i=0;i>mp[i][j];
	for(int i=1;i

你可能感兴趣的:(洛谷,算法,数据结构)