这道题目的大意是,输入N对夫妇,这N对夫妇按顺序站成一个圈,然后在圈中夫妇如果相邻的话便可以去除掉,直到最后所有的夫妇都可以去除掉则输出Yes,否则输出No。
例如:输入4对夫妇为
1 4 2 3 5 6 7 8
将这4对夫妇按顺序站好为1 2 3 4 5 6 7 8,其中1与8也相邻,因为这是一个圈,不过在内存中存储的时候就可以只用一个数组来表示这4对夫妇。可以把夫妇对应的位置设置为相同的数字,将数组变为1 2 2 1 3 3 4 4,然后题目就可以简化为删除掉这个数组中相邻且相同的数字了。
#include "iostream" using namespace std; #define N 100000 int couple[2*N]; int main() { int n; //夫妻数量 while (cin>>n && n !=0) { /*for (int i = 0; i < 2 * n; i++) { couple[i] = i + 1; //给数组赋初值 }*/ for (int j = 0; j < n; j++) //分别输入n对夫妻 { int a, b; //定义要输入的一对夫妻 cin>>a; cin>>b; couple[a-1] = j; //把a、b的对应位置设置为一样的 couple[b-1] = j; } int top = 0; //定义一个首指针和一个尾指针 int rear = 2 * n - 1; bool flag = false; //设置结束标记默认false while (1) { if (rear == top + 1) //结束标识,数组要还剩最后一组,肯定为一对 { flag = true; break; } else if (couple[rear] == couple[rear - 1]) //最后两个数相同 { rear -= 2;//最后两个数出数组 } else if (couple[rear] == couple[top]) //首尾相同 { top++; //首出列 rear--;//尾出列 } else break; } if(flag) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }