题意:有一个方阵有n行n列(3<=n<=9),共有n*n个人。现在已知他们的身高为170~200厘米之间。
求一种可行的方案将他们排在方阵中,使得同一行、同一列中,高度总是从中间向两边递减
解法:对输入的数据从大往小遍历,对矩阵从中央开始进行bfs即可。貌似是桶排序。
#include <iostream> #include <queue> using namespace std; const int mov[4][2]={0,1,0,-1,1,0,-1,0}; int n,tot,arr[201]={0},ans[10][10]={0}; struct node { int x,y; node(){x=y=0;} }u,v; int get() { while((!arr[tot])&&tot) --tot; --arr[tot]; return tot; } int main() { queue<node> q; cin>>n; for (int i=n*n;i;--i) { cin >> tot; ++arr[tot]; } tot=200; node tmp; tmp.x=(n+1)/2; tmp.y=(n+1)/2; ans[(n+1)/2][(n+1)/2]=get(); q.push(tmp); while(!q.empty()) { u=q.front(); q.pop(); for(int i=0;i<4;i++) { v.x=u.x+mov[i][0]; v.y=u.y+mov[i][1]; if ((v.x < 1) || (v.y < 1) || (v.x > n) || (v.y > n)) continue; if (ans[v.y][v.x]) continue; ans[v.y][v.x]=get(); q.push(v); } } for (int i=1;i<=n;++i) { for (int j=1;j<=n;++j) cout << ans[i][j] << ' '; cout << endl; } cin>>n; return 0; }