日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenJudge:熄灯问题

發布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++) {//總共有0 ~ (1^6 - 1)種狀態。memset(ans, 0, sizeof ans);//清空錯誤的ans數組,for(int j = 0; j < 6; j++)//如果第j位是1 代表摁過,需要反轉與其相關的燈。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() { // freopen("D:\\MY\\answer.txt","r",stdin);for(int i = 0; i < 5; i++)for(int j = 0; j < 6; j++)cin >> maze[i][j];solve();return 0; }

總結

以上是生活随笔為你收集整理的OpenJudge:熄灯问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。