acm专题五

一、第一题
代码:

#include <bits/stdc++.h>
using namespace std;
int m,a[10]={1},n;
void dfs(int x)
{
	int i;
	for(i=a[x-1];i<=m;i++)
	{
		if(i==n) continue;
		a[x]=i;m-=i;
		if(m==0)
		{
		  for(int j=1;j<x;j++) cout<<a[j]<<'+';
	      cout<<a[x]<<endl;
		}
		else dfs(x+1);
		m+=i;
	}
}
int main() 
{
   cin>>n;
   m=n;
   dfs(1);
    return 0;
}

思路:深度优先搜索

二、第二题
代码:

#include <bits/stdc++.h>
using namespace std;
int n,mapp[32][32],vis[32][32],i,j;
int line[4]={-1,1,0,0},row[4]={0,0,-1,1};
queue<int> p;
void bfs(int x,int y)
{
	vis[x][y]=1;
	p.push(x),p.push(y);
	while(!p.empty())
	{
		int nowx=p.front();p.pop();
		int nowy=p.front();p.pop();
		for(i=0;i<4;i++)
		{
			int newx=nowx+line[i],newy=nowy+row[i];
			if(newx>=0&&newx<n&&newy>=0&&newy<n&&mapp[newx][newy]==0&&!vis[newx][newy])
			vis[newx][newy]=1,p.push(newx),p.push(newy);
		}
	}
}
int main() 
{
	cin>>n;
	for(i=0;i<n;i++)
	    for(j=0;j<n;j++)
	    {
	    	cin>>mapp[i][j];
	    	if(mapp[i][j]) vis[i][j]=1;
		}
	for(i=0;i<n;i++)
	{
		if(!vis[0][i]) bfs(0,i);
		if(!vis[n-1][i]) bfs(n-1,i);
		if(!vis[i][0]) bfs(i,0);
		if(!vis[i][n-1]) bfs(i,n-1);
	}
	for(i=0;i<n;i++)
	{ 
		for(j=0;j<n;j++)
	    {
	    	if(!vis[i][j]) cout<<2<<' ';
	    	else cout<<mapp[i][j]<<' ';
		}
		cout<<endl;
	}
    return 0;
}

思路:用bfs将边界0标记为1,然后遍历数组,将标记为1的输出1,未标记则输出2

三、第三题
代码:

#include <bits/stdc++.h>
using namespace std;
int n,m,mapp[182][182],vis[182][182],i,j,tail=0,head=0;
int line[4]={-1,1,0,0},row[4]={0,0,-1,1};
struct xy{
	int x,y;
}a[1000010];
int main() 
{
	cin>>n>>m;
	for(i=0;i<n;i++)
	{
		string s;
		cin>>s;
		for(j=0;j<m;j++)
		if(s[j]=='0') vis[i][j]=0;
		else {vis[i][j]=1;mapp[i][j]=0;a[tail].x=i,a[tail++].y=j;}
	}
	for(head=0;head<=tail;head++)
	{
		for(i=0;i<4;i++)
		{
			int newx=a[head].x+line[i],newy=a[head].y+row[i];
			if(newx>=0&&newx<n&&newy>=0&&newy<m)
			if(!vis[newx][newy])
			{
				mapp[newx][newy]=mapp[a[head].x][a[head].y]+1;
				vis[newx][newy]=1;
				a[tail].x=newx,a[tail++].y=newy;
			}
		}
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++) cout<<mapp[i][j]<<' ';
		cout<<endl;
	}
    return 0;
}

思路:用bfs向四方拓展求最短距离,以白为起点

四、第四题
代码:

#include <bits/stdc++.h>
using namespace std;
int v,g,mapp[17][27],ans[17],anss[17],i,j,need[27],p=30;
int judge(int x)
{
	for(i=1;i<=v;i++)
	{
		int sum=0;
		for(j=1;j<=x;j++)
		sum+=mapp[ans[j]][i];
		if(sum<need[i]) return 0;
	}
	return 1;
}
void dfs(int x,int y)
{
	if(x>g)
	{
		if(judge(y))
		{
			if(y<p)
			{
			p=y;
			for(i=1;i<=p;i++) anss[i]=ans[i];
		    }
		}
	}
	else
	{
	ans[y+1]=x;dfs(x+1,y+1);dfs(x+1,y);
    }
}
int main() 
{
	cin>>v;
	for(i=1;i<=v;i++) cin>>need[i];
	cin>>g;
	for(i=1;i<=g;i++) for(j=1;j<=v;j++) cin>>mapp[i][j];
	dfs(1,0);
	cout<<p<<' ';
	for(i=1;i<=p;i++) cout<<anss[i]<<' ';
    return 0;
}

思路:dfs深搜每种饲料,通过judge函数判断是否合理

总结:学会将过程分解为个个步骤,灵活套用dfs和bfs模板

posted @ 2025-02-13 14:00  astronomyy  阅读(20)  评论(0)    收藏  举报