UVA110

来源:互联网 发布:中国站长站 源码 编辑:程序博客网 时间:2024/06/05 15:22

题目的意思就是让程序写排序。

根据那个输出意思应该很明白;

这题做法应该是一个一个字母插入,首先插入a;

然后插入b 。 b可以插在后面变成 ab ,也可以插在前面,变成ba。

然后插入c 分别是abc  ,acb ,cab  , bac ,bca , cba 和输出结果的顺序一样,那就是按这样的。

可以用回溯来实现这种插入 ,现在注意的就是输出格式,输出格式最难的就是什么时候if 什么时候 else if ,什么时候 else ,还有就是if后面比较的两个数是什么;

看输出可以发现

在输出 if  a < b时,我们程序正在做 把 b 插入 a后面这个步骤,

输出 if b < c 时,正在做 把 c 插入b 这个步骤。

可以得出在做插入步骤时,输出该位置上的值,和要插入的值即可。。

然后什么时候是 else if ? 可以发现,如果你做的是每次要把数字插入最后面时 输出是if 而如果不是插入最后面 则输出 else if,因为插入最后面,说明这次比较是最外层比较,不是最后一个位置,则说明要先把先前那个比较否定掉,要加else;

那单独的else 什么时候输出,就是要插入到最开头的位置时。。因为这时候最外面一层if要否定;


AC代码:

#include<iostream>#include<algorithm>#include<string>using namespace std;const int N = 10;int num;char res[N];void c_insert(string& str, int pos, char ch) {string temp = "";temp += ch;str.insert(pos , temp);}void writen ( string a) { cout << "writeln(";for (int i = 0 ; i < num ; i++) {cout << a[i];if (i != num - 1) cout << "," ;elsecout << ")"<<endl;}}void print_process (int cur , string str) {if (cur == num) {writen(str);return;}int t = 0;for (int i = cur ; i >=0  ; i--) {if(i == 0)cout << "else" << endl;else if(!(t++))cout << "if "<< str[i - 1] << " < " << res[cur] <<" then" <<endl;elsecout << "else " << "if "<< str[i - 1] << " < " << res[cur] <<" then" <<endl;c_insert(str , i , res[cur]);print_process (cur + 1 , str);str.erase(i ,1);}}int main () {int t ;cin >> t;while (t--) {cin >> num;for (int i = 0 ; i < num ; i++) {res[i] = 'a' + i;}cout << "program sort(input,output);" <<endl;cout << "var" <<endl;for (int i = 0 ; i < num ; i++ ) {cout << res[i];if (i != num - 1 )cout << ",";elsecout <<" : integer;\nbegin\nreadln(";}for (int i = 0 ; i < num ; i++) {cout << res[i];if (i != num - 1)cout << ",";elsecout << ");\n";}string temp = "";temp += res[0];print_process(1,temp);cout << "end.\n";if (t)cout << endl;}return 0;}





0 0
原创粉丝点击