输入描述:
第一行输入一个整数N,N<=30。 第二行输入N个整数。
输出描述:
按题意输出。
输入样例#:3 1 2 3 | 输出样例#:(1,2) (1,3) (2,1) (2,3) (3,1) (3,2) |
#include <stdio.h>
void quicksort(int s[],int min,int max); //快速排序
int partition(int s[],int min,int max);
int main(){
int n;
int s[30];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&s[i]);
}
int same=0;
int samenum[30]={0};
for(int i=0;i<n-1;i++) //找到数组中相同元素的个数-1并记录值
{
int flag=0;
for(int k=0;k<same;k++)
{
if(s[i]==samenum[k])
{
flag=1;
break;
}
}
if(flag==1)
continue;
for(int j=i+1;j<n;j++)
{
if(s[i]==s[j])
{
samenum[same]=s[i];
same++;
}
}
}
quicksort(s,0,n-1); //排序
int num[30*29][2]={0};
int sum=0;
for(int i=0;i<n;i++) //将整个数组两两组合的所有二元组,包括自身,并记录总数
{
for(int j=0;j<n;j++) //以原数组每个数开头为一组,二维数组num中共有n组,每组有n条数据,一条数据(num[0][0],num[0][1])就是一个二元组
{
num[i*n+j][0]=s[i];
num[i*n+j][1]=s[j];
sum++;
}
}
int del[30*29];
int sumdel=0; //需删除总数
for(int i=0;i<n;i++)
{
del[sumdel]=i*n+i; //记录需删除的自身组合位置
sumdel++;
for(int j=0;j<n-1;j++) //以原数组每个数开头为一组,二维数组num中共有n组,每组有n条数据,一条数据(num[0][0],num[0][1])就是一个二元组
{
for(int k=j+1;k<n;k++){
if(num[i*n+j][1]==num[i*n+k][1]) //删除每组中相同的两条数据的第一条(仅记录需删除位置)
{
if((i*n+j!=i*n+i)&&(i*n+k!=i*n+i))
{
del[sumdel]=i*n+j;
sumdel++;
}
}
}
}
}
int isdel=0;
for(int i=0;i<same;i++) //删除每两组相同数据中的第一组(仅记录需删除位置)
{
for(int j=0;j<n;j++)
{
if(isdel>=same)
break;
if(num[j*n][0]==samenum[isdel])
{
for(int k=0;k<n;k++) //删除一组元素
{
del[sumdel]=j*n+k;
sumdel++;
}
isdel++;
}
}
}
for(int i=0;i<sum;i++) //输出二元组,遇到需删除位置就跳过不输出
{
int flag=0;
for(int j=0;j<sumdel;j++)
{
if(i==del[j])
{
flag=1;
break;
}
}
if(flag==1)
continue;
printf("(%d,%d)\n",num[i][0],num[i][1]);
}
}
void quicksort(int s[],int min,int max) //快速排序
{
if(min<max)
{
int pivotpos=partition(s,min,max);
quicksort(s,min,pivotpos-1);
quicksort(s,pivotpos+1,max);
}
}
int partition(int s[],int min,int max)
{
int pivot=s[min];
while(min<max)
{
while(min<max&&s[max]>=pivot)
max--;
s[min]=s[max];
while(min<max&&s[min]<=pivot)
min++;
s[max]=s[min];
}
s[min]=pivot;
return min;
}
运行结果: