题解 P1157 【组合的输出】
ICE_Wol
2018-05-17 23:15:36
其实本题递归深搜可以轻松解决问题
但无奈题干不允许使用递归
所以以下给出非递归解法
具体解析参见代码注释
整份代码的核心在于第32行的判断条件,务必要注意
```cpp
#include<iostream>
#include<iomanip>
using namespace std;
int a[1005],n,m,arr = 1;
int main()
{
cin >> n >> m;
while(arr){
if(arr >= m + 1){ //达到边界时打印解
for(int i = 1;i <= m;i++)
cout << setw(3) << a[i]; //注意场宽设置
cout << endl;
arr--; //回溯到前一位
continue;
}
if(!a[arr]){ //若该位置为空
a[arr] = a[arr - 1] + 1; //在其前一位基础上加一
arr ++;
continue;
}
if(a[arr] + m - arr < n){ //**关键** 判定在当前位为a[arr]的情况下向后推(m - arr)位是否超出题目的最大数字限制
a[arr++] ++; //当前位自加后挪至后一位
continue;
}
a[arr--] = 0; //将当前位归零,回溯至前一位
}
return 0;
}
```