小小故事
题目描述 Description在天朝的鱼C总基地,大厅的墙壁上有N盏灯,分别按顺序从1到N编号。每盏灯都可以每打开或关上。在每一秒钟,如果第I+1盏灯是亮的,那么第I盏灯在下一秒会变化它的状态;特别的,如果第1盏灯是亮的,那么第N盏灯在下一秒会变化它的状态。小甲鱼老师给你某一时刻所有灯的状态,
希望你能求出它们在M秒之后的状态。
输入描述 Input Description
第一行输入两个数N,M。第二行,依次输入N个数,不是0就是1。描述初始时各盏灯的状态。如果这个数为0,表示第I盏灯是灭的;如果这个数为1,表示第I盏灯是亮的。
输出描述 Output Description
输出有N个数,不是0就是1。描述M秒后各盏灯的状态。如果这个数为0,表示第I盏灯是灭的;如果这个数为1,表示第I盏灯是亮的。
样例输入 Sample Input3 1
0 0 1
样例输出 Sample Output
0 1 1
[解题思路]
直接暴力枚举了,两个for循环,第一个for控制秒数M,循环M次,第二个for控制灯N,循环N次,但有一个需要注意的地方就是,这里的解法是正序遍历各盏灯(即i=1..n),例如在考虑第i盏灯的变化状态的时候,受第i+1盏的影响,特别的,第n盏灯的变化状态是受第1盏灯的影响,而从1到n的遍历,第1盏灯会被第2盏灯影响,改变状态。
解决的方法是先用个变量保存未改变前的第1盏灯。
[代码实现]
#include<iostream>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int *a=new int [n+1];
for(int i=1;i<=n;i++)
cin>>a[i];
int temp; /* 存放a[1] */
for(int i=1;i<=m;i++) /* m控制秒数 */
for(int j=1;j<=n;j++) /* n控制灯数 */
{
if(j == 1)
temp=a[1];
if(j == n)
{
if(temp == 1)
a[j] = !a[j];
continue;
}
if(a[j+1] == 1)
a[j] = !a[j]; /* 若a[j]为1则变为0,若为0则变为1 */
}
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
delete a;
return 0;
}