看代码之前, 先总结一下心得体会:
一开始做得很着急,以为简单按照题目叙述往下 if else 就成了,但是到最后写得一团浆糊, 检查也看不出考虑不周的点;
今天“痛改前非”, 开始敲代码前先按照理解将工作流程图给画了一遍(如下图), 诶, 立刻清楚了不少!
无论是否借助流程图, 我建议大家开始写代码之前先明确几个要素:
1. 如果要循环操作,那么循环的依据是什么 (本题中,我选择“成功插上一根松针”为主while循环的依据)//注意, 这点感觉是蛮重要的,在整个循环中都要保证是同一个阶段,这样不容易错
2. 如果有循环, 那么循环break的条件是什么(本题中,盒子空 && 推送器空 => break(即所有松针都插上了))
3. 需要的变量有哪些, 除了题目条件直接点出的(如推送器)之外,大体上还需要设哪些辅助变量(如本题中设 i_tui 指示推进器当前推送的松针序号, 最终用 i_tui==size(推进器)判断推送完全 )
具体代如下, 希望对你有帮助~:
#include<stdio.h>
#include<stack>
#include<iostream>
using namespace std;
#define size 1001
int main()
{
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
int tui[size]={0};
for(int i=0; i<n; i++)
{
scanf("%d", &tui[i]);
}
stack<int>s;
int num_s=0, i_tui=0, flag=0, f1=0, y_re=-1, x_re=0, re[500][500]={0};
int cur, rem;
while(1)
{
if(s.empty() && i_tui==n) break;
if(flag==0)//新的一根
{
y_re++; x_re=0;
if(s.empty()){
cur = tui[i_tui]; i_tui++;
}
else{
cur = s.top(); s.pop(); num_s--;
}
re[y_re][x_re]=cur; x_re++;
rem = cur;
flag=1;
continue;
}
if(!s.empty())
{
cur = s.top();
if(cur<=rem)
{
re[y_re][x_re]=cur; x_re++;
rem = cur;
s.pop(); num_s--;
if(x_re == k)
{
flag = 0;
}
continue;
}
}
while(1)
{
if(i_tui == n){
flag = 0; break;
}
cur=tui[i_tui]; i_tui++;
if(cur<=rem)
{
re[y_re][x_re]=cur; x_re++;
rem = cur;
break;
}
else{
if(num_s==m)
{
flag = 0; f1=1; i_tui--;
break;
}
s.push(cur); num_s++;
}
}
if(x_re == k)
{
flag = 0;
}
}
for(int i=0; i<=y_re; i++)
{
for(int j=0; re[i][j]!=0; j++)
{
printf("%d", re[i][j]);
if(re[i][j+1]!=0) printf(" ");
}
if(i!=y_re)
printf("\n");
}
return 0;
}