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模板

浙公网安备 33010602011771号