生活随笔
收集整理的這篇文章主要介紹了
OpenJudge:熄灯问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
大意就是,摁一個開關,它的前后左右以及他自己的狀態都會改變。
原本是開的變成關的,原本是關的變成開的。
我們的任務就是把所有的燈都變成關閉狀態。
我們可以這樣想象,第一排的燈已近摁完了,確實是正確答案,第一行就不再摁了,于是,要讓第一排的燈全部熄滅,就需要通過摁第二行的燈,以此下去后面的燈的狀態也就確定了。
#include<iostream>
#include<cstring>
using namespace std
;
const int ax
[5] = {1, 0, 0, -1, 0};
const int ay
[5] = {0, 1, -1, 0, 0};
int maze
[10][10], backup
[10][10], ans
[10][10];
void turn(int x
, int y
) {for(int i
= 0; i
< 5; i
++) {int tempx
= x
+ ax
[i
];int tempy
= y
+ ay
[i
];if(tempx
>= 0 && tempx
< 5 && tempy
>= 0 && tempy
< 6)maze
[tempx
][tempy
] = !maze
[tempx
][tempy
];}
}
void solve() {memcpy(backup
, maze
, sizeof maze
);for(int i
= 0; i
< 1 << 6; i
++) {memset(ans
, 0, sizeof ans
);for(int j
= 0; j
< 6; j
++)if(i
>> j
& 1) {ans
[0][j
] = 1;turn(0, j
);}for(int j
= 0; j
< 4; j
++)for(int k
= 0; k
< 6; k
++)if(maze
[j
][k
] == 1) {ans
[j
+ 1][k
] = 1;turn(j
+ 1, k
);}int flag
= 1;for(int j
= 0; j
< 6; j
++)if(maze
[4][j
] == 1) {flag
= 0;break;}if(flag
) break;memcpy(maze
, backup
, sizeof backup
);}for(int i
= 0; i
< 5; i
++) {for(int j
= 0; j
< 6; j
++)cout
<< ans
[i
][j
] << " ";cout
<< endl
;}
}
int main() {
for(int i
= 0; i
< 5; i
++)for(int j
= 0; j
< 6; j
++)cin
>> maze
[i
][j
];solve();return 0;
}
總結
以上是生活随笔為你收集整理的OpenJudge:熄灯问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。