UVA110

该博客介绍了如何解决UVA110题目,这是一个关于字母排序的问题。通过回溯法,逐步插入字母并判断其位置,以满足题目要求的排序顺序。博主详细解释了何时使用`if`、`else if`和`else`来处理不同情况,特别是输出格式的处理。最后给出了获得AC(Accepted)状态的代码。
摘要由CSDN通过智能技术生成

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

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

这题做法应该是一个一个字母插入,首先插入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 << "," ;
		else
			cout << ")"<<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;
		else
			cout << "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 << ",";
			else
				cout <<" : integer;\nbegin\nreadln(";
		}
		for (int i = 0 ; i < num ; i++) {
			cout << res[i];
			if (i != num - 1)
				cout << ",";
			else
				cout << ");\n";
		}
		string temp = "";
		temp += res[0];
		print_process(1,temp);
		cout << "end.\n";
		if (t)
			cout << endl;

	}
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值