流浪地球
描述
流浪地球计划在赤道上均匀部署了N个转向发动机,按位置顺序编号为0~N-1。
1) 初始状态下所有的发动机都是未启动状态;
2) 发动机起动的方式分为“手动启动”和“关联启动”两种方式;
3) 如果在时刻1一个发动机被启动,下一个时刻2与之相邻的两个发动机就会被“关联启动”;
4) 如果准备启动某个发动机时,它已经被启动了,则什么都不用做;
5) 发动机0与发动机N-1是相邻;
地球联合政府准备挑选某些发动机在某些时刻进行“手动启动”,当然最终所有的发动机都会被启动。
哪些发动机最晚被启动呢?
输入描述:
第一行两个数字N和E,中间有空格
N代表部署发动机的总个数,E代表计划手动启动的发动机总个数
1<N<=1000,1<=E<=1000,E<=N
接下来共E行,每行都是两个数字T和P,中间有空格
T代表发动机的手动启动时刻,P代表此发动机的位置编号。
0<=T<=N,0<=P<=N
输出描述:
第一行一个数字N,以回车结束
N代表最后被启动的发动机个数
第二行N个数字,中间有空格,以回车结束
每个数字代表发动机的位置编号,从小到大排序
示例:
输入
8 2
0 2
0 6
输出
2
0 4
代码如下:
//检查是否全启动
bool CheckAll(int[] list)
{
for(int i = 0; i < list.length; i++)
{
if(list[i] == 0)
return false;
}
return true;
}
//关联启动
void gettrigger(int index, ref int[] list, int length)
{
if(index >= length)
index = index - length;
int left = index - 1;
left = (left >= 0 ? left : length - 1);
int right = index + 1;
right = (right >= length ? right - length : right);
list[left] = 1;
list[right] = 1;
}
//具体实施函数
void function(int N, int E, int[] Ts, int[] P)
{
int[] list = new int[N];
int[] list1 = new int[N];
int count = 0; bool c = false;
do
{
if(count == 0)//当前时刻是否需手动启动
{
for(int i = 0; i < E; i++)
{
if(Ts[i] == count)
list[P[i]] = 1;
}
}
else
{
Array.Copy(list, list1, N);
for(int i = 0; i < N; i++)
{
if(list[i] == 1)
{
gettrigger(i, ref list, N);
i++;
}
}
for(int i = 0; i < E; i++)
{
if(Ts[i] == count)
list[P[i]] = 1;
}
}
count++;
c = CheckAll(list);
if(c)
{
count = 0;
string str = "";
for(int i = 0; i < N; i++)
{
if(list1[i] == 0)
{
count++;
str += i.ToString() + " ";
}
}
Console.WriteLine(count);
Console.WriteLine(str.Substring(0, str.length - 1));
}
}
while(!c);
}