[编程题] 序列交换
时间限制:1秒
空间限制:32768K
牛牛有一个长度为n的整数序列s,羊羊要在牛牛的序列中选择不同的两个位置,然后交换这两个位置上的元素。现在需要求出羊羊交换后可以得到的不同的序列个数。(注意被交换的两元素值可能相同)。
如序列{1, 47},输出1.羊羊必须交换仅有的两个元素,得到序列{47, 1}。羊羊必须交换,不能保留原有的序列。
{1, 2, 1},输出3.羊羊通过交换可以得到{2, 1, 1},{1, 1, 2},{1, 2, 1}这三个序列。
输入描述:
输入包括两行,第一行为一个整数n(2 ≤ n ≤ 50),即序列的长度。 第二行n个整数,表示序列的每个元素a_i(1 ≤ a_i ≤ 50),以空格分割。
输出描述:
输出一个整数,表示羊羊可以得到的不同的序列个数
输入例子:
3 1 2 1
输出例子:
3
解题思路:我自己的思路是,用int数组存储,然后交换数组的i和j位,然后转成字符串,存入set中
1 #include <iostream> 2 #include <set> 3 #include<sstream> 4 #include <memory.h> 5 using namespace std; 6 void Fun(int *str,int n,int start,int end,int *temp) 7 { 8 for(int i=0;i<n;i++) 9 { 10 temp[i] = str[i]; 11 } 12 int r = temp[start]; 13 temp[start] = temp[end]; 14 temp[end] = r; 15 /*for(int i=0;i<n;i++) 16 { 17 cout<<"temp "<<temp[i]<<" "; 18 } 19 cout<<endl;*/ 20 } 21 //int 数组转string 22 string IntToString(int & i) 23 { 24 string s; 25 stringstream ss(s); 26 ss<<i; 27 return ss.str(); 28 } 29 int main() 30 { 31 int n; 32 while(cin>>n) 33 { 34 int a[n]; 35 int t[n]; 36 set<string> s; 37 string strs; 38 for(int i=0;i<n;i++) 39 { 40 cin>>a[i]; 41 } 42 43 for(int i=0;i<n;i++) 44 { 45 for(int j=i+1;j<n;j++) 46 { 47 Fun(a,n,i,j,t); 48 49 for(int k=0;k<n;k++) 50 { 51 52 int &tt=t[k]; 53 strs+=IntToString(tt); 54 } 55 s.insert(strs); 56 strs.clear(); 57 } 58 } 59 cout<<s.size()<<endl; 60 s.clear(); 61 62 } 63 return 0; 64 }
有一个测试用例未通过,不知道原因。
参考网上思路:是用vector存储,然后set<vector<int>>,也是交换i和j位,然后放入set
1 #include <iostream> 2 #include <set> 3 #include <vector> 4 5 using namespace std; 6 7 8 int main() 9 { 10 int n; 11 while(cin>>n) 12 { 13 vector<int> a; 14 int temp; 15 set<vector<int> > s; 16 17 for(int i=0;i<n;i++) 18 { 19 cin>>temp; 20 a.push_back(temp); 21 } 22 23 for(int i=0;i<n;i++) 24 { 25 for(int j=i+1;j<n;j++) 26 { 27 swap(a[i],a[j]); 28 s.insert(a); 29 swap(a[i],a[j]); 30 } 31 } 32 cout<<s.size()<<endl; 33 s.clear(); 34 35 } 36 return 0; 37 }