一、第一题
代码:
#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模板