现在你不知道站在圆圈里的确切人数(但毫无疑问,这个数字是偶数),但你知道编号为a的人正看着编号为b的人(当然编号b的人肯定也正看着编号a)。请你编写一个程序,求编号c的人正看着的人编号是多少?如果对于指定的a、b和c,不存在这样的圆,则输出-1。
时间: 2023-06-18 21:04:19 浏览: 80
假设圆中有n个人,那么我们可以把每个人看作一个点,a看b可以看作a指向b的一条有向边。则圆可以看作是一个有向图,且每个点的入度和出度都为1(因为每个人都只能看一个人,同时也只有一个人能看他)。
根据题目条件,a和b之间必定有一条路径,即a -> b或b -> a。我们可以通过遍历这条路径,找到c所在的位置。
具体实现可以用一个vector记录每个点的出边指向的点,再用一个bool数组记录哪些点已经被访问过。我们从a开始,沿着出边遍历,直到遇到b或已经回到了a。如果找到了b,则从b开始沿着出边遍历,直到找到c或又回到了b。如果找到了c,则返回对应的编号,否则说明圆中不存在c,返回-1。
以下是代码实现:
相关问题
用c++代码写一些人(这个数字是偶数)站在一个圆圈。人们均匀地站成一圈。他们从数字11的人开始顺时针编号。每个人都通过圆圈的中心看着对面的人。你不知道站在圆圈里的确切人数(但这个数字是偶数,毫无疑问)。我们知道,有数字的人在看有数字b的人(当然,反之亦然)。一个人被数字c的人看,与这个人相关联的数字是多少?如果对于指定的a、b和c,不存在这样的圆,则输出-1。
以下是求解该问题的代码实现:
```c++
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
int N = -1;
for (int i = 12; i <= 1000000; i += 2) { // 枚举人数N
if ((i - a) % i == i / 2 && (b - a) % i == i / 2) {
N = i;
break;
}
}
if (N == -1) {
cout << "-1" << endl;
} else {
int z = (c - a + N - 1) % N + 1;
if ((z - b + N) % N == N / 2) {
cout << z << endl;
} else {
cout << "-1" << endl;
}
}
return 0;
}
```
代码中首先读入a、b、c三个数字,然后从12开始枚举人数N,检验是否满足题目中给出的条件。如果找到了符合条件的N,就计算出z的值,并检验是否满足"c在b的对面"的条件。如果符合条件,则输出z的值;否则输出-1。需要注意的是,题目中给出的人员编号从11开始,而不是从1开始,因此在计算z的值时需要加上N-1。
用c++代码模拟一个人画一个圆圈,要知道人画圆圈不是绝对圆,因此你要模拟出画圆的误差
好的,这个问题属于技术问题,我可以回答。以下是一段使用C代码模拟人画圆的程序,其中加入了误差来模拟人的手抖动和不规则画圆的情况。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int x, y, r;
printf("请输入圆心坐标(x, y): ");
scanf("%d%d", &x, &y);
printf("请输入半径: ");
scanf("%d", &r);
srand(time(NULL)); // 初始化随机数种子
for (int i = 0; i < 360; i++) {
int dx = rand() % 5 - 2; // 手抖动的误差
int dy = rand() % 5 - 2;
int xx = x + (int)((double)r * cos((double)i * 3.1415926 / 180)) + dx;
int yy = y + (int)((double)r * sin((double)i * 3.1415926 / 180)) + dy;
printf("(%d, %d)\n", xx, yy);
}
return 0;
}
```
这段程序会读入圆心坐标和半径,然后用360个点来模拟绘制圆。每个点的坐标都有一定的随机误差,从而模拟出人的手抖动和画圆不规则的情况。