输入:
(第一行数据表示 Man(Woman)的数目 n;接下来的数据中,第一个 n*n 的数据
块表示 Man 的优先列表;另一个 n*n 的数据块表示 Woman 的优先列表)
5 ———————- (Man(Woman)的数目 n)
2 1 4 5 3 ————– (第一个男人的优先列表)
4 2 1 3 5
2 5 3 4 1 ————– (第三个男人的优先列表)
1 4 3 2 5
2 4 1 5 3
5 1 2 4 3 ————– (第一个女人的优先列表)
3 2 4 1 5
2 3 4 5 1
1 5 4 3 2
4 2 5 3 1
输出
男人 1 到 n 的匹配对象,每个数字后边跟一个空格,最后输出一个\n。
package gs;
import java.util.Arrays;
import java.util.Scanner;
public class gsalg {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
Woman women[] = new Woman[num];
Man men[]= new Man[num];
// System.out.println("num= "+num);
for(int i=0;i// System.out.println("输入第 "+(i+1)+"个男人心中的优先顺序");
int[] a=new int[num];
for(int j=0;jnew Man(); //必须先初始化
men[i].setRank(a);
// System.out.println(Arrays.toString(men[i].rank));
}
for(int i=0;i// System.out.println("输入第 "+(i+1)+"个女人心中的优先顺序");
int[] a=new int[num];
for(int j=0;jnew Woman(); //必须先初始化
women[i].setRank(a);
// System.out.println(Arrays.toString(women[i].rank));
}
for(int i=0;iif(!men[i].isDate()){ //如果i这个男人没有在约会 这个男生是(i+1)号
int chase =men[i].getRank()[men[i].getBetter()]; //目前最喜欢chase号女生
System.out.println((i+1)+"号男生目前最喜欢"+chase+"号女生");
men[i].setBetter(men[i].getBetter()+1); //成功与否都已经向这个女人请求过了
System.out.println("追求过的数量变为:"+men[i].getBetter());
if(!women[chase-1].isDate()){ //如果i心仪的女人没有约会
men[i].setDate(true);
men[i].setPresent(chase);
women[chase-1].setDate(true);
women[chase-1].setPresent(i+1);
System.out.println((i+1)+"号男生和"+chase+"号女生配成一对");
}
else{ //这个女人正在约会 对比现在这个男人和正在约会的男人哪个优先级更高
System.out.println("女方有约会对象");
int later=0,former=0;
for(int r=0;r//获取排名
if(women[chase-1].getRank()[r]==(i+1)){
later=r;
// System.out.println("later:"+later);
}
if(women[chase-1].getRank()[r]==women[chase-1].getPresent()){
former=r;
// System.out.println("former:"+former);
}
}
if(later>former){//你不如对方正在约会的对象
System.out.println("former>later 你不如对方正在约会的对象");
i=-1;//有人单身狗,必须重新走
}else if(later//你比正在约会的强
System.out.println("former);
System.out.println(women[chase-1].getPresent()+"被分手");
men[women[chase-1].getPresent()-1].setDate(false);//前任被分手
men[women[chase-1].getPresent()-1].setPresent(100);
men[i].setDate(true);
men[i].setPresent(chase);
women[chase-1].setPresent(i+1);
i=-1;//有人单身狗,必须重新走
}else{
// System.out.println("former=later 有问题");
}
}
}
}
//循环结束,输出结果
for(int i=0;iout .print(men[i].getPresent()+" ");
}
System.out.println();
}
}
class People {
private int id;
private int better=0; //追求过几位女生
private int[] rank;
private boolean date=false;
private int present=100;
private int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getBetter() {
return better;
}
public void setBetter(int better) {
this.better = better;
}
public int[] getRank() {
return rank;
}
public void setRank(int[] rank) {
this.rank = rank;
}
public boolean isDate() {
return date;
}
public void setDate(boolean date) {
this.date = date;
}
public int getPresent() {
return present;
}
public void setPresent(int present) {
this.present = present;
}
}
class Woman extends People{
}
class Man extends People{
}
#include
#include
using namespace std;
int num;
int getRank(int *a,int x){ //找到x在数组中的位置
for(int i=0;iif(a[i]==x){
return i;
}
}
return -1;
}
int getGirl(int *a){
for(int i=0;iif(a[i]!=-1){
int theGirl=a[i];
a[i]=-1;
return theGirl;
}
}
return -1;
}
void gsAlg(int *out,int **manArray, int **ladayArray){
for(int i=0;iif(out[i]==-1){ //还有单身狗 iL 男士
int date=getGirl(manArray[i]);//获取当前最喜欢的女生号,并且将此位置换为-1
cout<<"现在是"<<(i+1)<<"号男生,他现在追求"<"号女生"<<"\n";
int isdated = getRank(out, date);//>0代表有约会对象
if(isdated<0){
out[i]=date; //配对
cout<<"没有前任"<<(i+1)<<"号男生与"<"号女生成功配对"<<"\n";
}else{//女生有约会对象
int formerId=getRank(out,date);//获取正在约会对象的L
int formerRank=getRank(ladayArray[date-1],(formerId+1));
int laterRank=getRank(ladayArray[date-1], (i+1));
for(int i=0;icout<1][i];
}
cout<<"有约会对象,是"<1<<"他的地位:"<" 你的地位:"<"\n";
if(laterRank>formerRank){//你的排名靠后,不如前任
i=-1;
cout<<"你的排名靠后,不如前任\n";
}else{//排名比前任强
out[i]=date; //成功上位
out[formerId]=-1;//前任被分手
i=-1;
cout<1<<"被分手\n";
}
}
}
}
}
int main(int argc, const char * argv[]) {
cin>>num;
int **manArray= new int *[num];
int **womanArray= new int *[num];
// cout<<"Enter a number:\n";
// cout<<"Now enter the orders:\n";
for(int i=0;inew int[num]; //一维数组赋值
}
for(int i=0;inew int[num]; //一维数组赋值
}
//输入
for(int i =0;ifor(int j=0;jcin>>manArray[i][j];
}
}
for(int i =0;ifor(int j=0;jcin>>womanArray[i][j];
}
}
// for(int i=0;i
// for(int j=0;j
// cout<
// }
// cout<<"\n";
// }
//
// for(int i=0;i
// for(int j=0;j
// cout<
// }
// cout<<"\n";
// }
int *out =new int[num]; //输出结果的数组
for(int i=0;i//先都初始化为-1
out[i]=-1;
}
gsAlg(out,manArray,womanArray);
for(int i=0;i//最终结果输出
cout<" " ;
}
return 0;
}
由书上的伪代码转换为具体语言实现,逻辑并不复杂但是需要注意的小地方有很多。
对于循环来说,如果有人被分手,那么就要重新循环一次,考虑如果使用栈的数据结构会提高效率。
个人觉得JAVA写的十分繁琐,还可以精简很多。