国产一区二区美女诱惑_国产精品免费播放_91精品国产综合久久香蕉麻豆 _久久精品30_久久综合88_国产精品亚洲成人_黑人极品videos精品欧美裸_亚洲色图欧美激情

原創生活

國內 商業 滾動

基金 金融 股票

期貨金融

科技 行業 房產

銀行 公司 消費

生活滾動

保險 海外 觀察

財經 生活 期貨

當前位置:原創 >

一步一步地完成題目——費解的開關(C/C++語言)遞推、遞歸、順序思維 全球新動態

文章來源:騰訊云  發布時間: 2023-02-12 13:19:07  責任編輯:cfenews.com
+|-

前言

本文中博主將一步一步地、以正常人的順序思維完成題目——費解的開關,使用的核心方法是遞推與遞歸。

題目

參考題目:費解的開關

詳細的題目信息相信大家都已經知道了,因此這里為了簡潔只展示輸入輸出格式及數據范圍。


(資料圖片僅供參考)

核心思維

本題利用遞推做的核心思想很簡單,即當這個5x5數組的第一行被處理完過后,想要開啟第一行仍然滅著的燈,則必須點擊該燈的下一行的相同位置。

因此,只要確定好第一行如何選擇,其他行也自然確定了,之需要判斷該種情況是否滿足題目條件即可。

如圖所示:

假設我們第一行只點一次,即被藍色X的地方,點完后會變成這樣:

如果我們想讓第一行的第一個、第四個變亮,那么第二行的第一個、第四個就是必點的。

因此,我們只需要枚舉第一行的所有選法,然后就能遞推出整個四方體的選法,最后判斷成是否成立。

寫出數據輸入格式

首先,先在主函數里寫出題目要求的輸入格式。先輸入一個n,隨后進行n次循環,每次循環都讀入25個數據放在一個二維數組arr里。為了傳參的時候方便,我們把二維數組放在外面,像這樣:

int arr[5][5];int main(){int n = 0;scanf("%d", &n);while (n--){int i = 0;for (i = 0; i < 5; i++){int j = 0;for (j = 0; j < 5; j++){scanf("%1d", &arr[i][j]);}}//...}return 0;}

注意:本題在Acwing上數據輸入時,每個數據之間沒有空格,因此要控制scanf每次讀取數據的寬度。代碼中的“//...”代表接下來從此處開始寫。

枚舉第一行的選擇

這里我們使用遞歸的方法,即在1 ~ 5里面選出1 ~ 5個數,每一種選法都是一種第一行的選擇。創建遞歸函數dfs(int step),step代表當前枚舉的位置,在外面創建數組choose代表遞歸時每個位置的狀態,每次枚舉當前位置選或者不選,五個位置都枚舉結束后就代表形成了一種情況,隨后利用判斷函數jud對這種情況進行判斷。

int main(){//...dfs(0);//dfs的位置}return 0;}
int arr[5][5];int choose[5];void dfs(int step){if (step == 5){jud(choose);return;}//選choose[step] = 1;dfs(step + 1);choose[step] = 0;//不選dfs(step + 1);}

判斷情況是否成立(1)

隨后我們進行判斷函數jud的書寫,為了防止同一組數組不同的情況互相影響,我們創建一個臨時的數組 arr,復制arr的信息到其中,隨后對 arr進行操作。

之后創建i和j,分別用于遍歷行和列。

由于i和j的值不同,點燈還是滅燈的個數也不同(因為有可能在邊界)。因此,我們創建一個函數change,用于改變arr【i】【j】周圍能改變的燈的亮滅情況。

void jud(int* choose){int _arr[5][5];memcpy(_arr, arr, 25 * 4);//對第一行進行操作int i = 0;//用于遍歷行int j = 0;//用于遍歷列for (j = 0; j < 5; j++){if (choose[j] == 1)//相當于arr【0】【j】被選擇了{change(_arr, 0, j);//...}}}

實現亮滅改變函數

羅列情況,改變周圍燈的亮滅情況,如果你不想寫這么多的代碼,也可以把剛開始創建的數組改為7x7大小,就可以不用考慮邊界了。

void change(int _arr[5][5], int i, int j){_arr[i][j] = !_arr[i][j];if (i == 0){_arr[i + 1][j] = !_arr[i + 1][j];if (j == 0){_arr[i][j+1] = !_arr[i][j+1];}else if (j == 4){_arr[i][j-1] = !_arr[i][j-1];}else{_arr[i][j - 1] = !_arr[i][j - 1];_arr[i][j + 1] = !_arr[i][j + 1];}}else if (i == 4){_arr[i - 1][j] = !_arr[i - 1][j];if (j == 0){_arr[i][j + 1] = !_arr[i][j + 1];}else if (j == 4){_arr[i][j - 1] = !_arr[i][j - 1];}else{_arr[i][j - 1] = !_arr[i][j - 1];_arr[i][j + 1] = !_arr[i][j + 1];}}else{_arr[i - 1][j] = !_arr[i - 1][j];_arr[i + 1][j] = !_arr[i + 1][j];if (j == 0){_arr[i][j+1] = !_arr[i][j+1];}else if (j == 4){_arr[i][j - 1] = !_arr[i][j - 1];}else{_arr[i][j - 1] = !_arr[i][j - 1];_arr[i][j + 1] = !_arr[i][j + 1];}}}

判斷情況是否成立(2)

因為對第一行的每一次選擇也算走了一步,所以在每種情況下設置一個變量time,記錄當前走了幾步,一旦time超過6,就立馬return。

注意:第一行只有五個數,因此在第一行的選擇中time不可能超過6,因此不需要在對第一行的選擇中進行判斷。

void jud(int* choose){int _arr[5][5];memcpy(_arr, arr, 25 * 4);int time = 0;//對第一行進行操作int i = 0;//用于遍歷行int j = 0;//用于遍歷列for (j = 0; j < 5; j++){if (choose[j] == 1)//相當于arr【0】【j】被選擇了{time++;change(_arr, 0, j);}}//...//對2,3,4,5行進行操作}

隨后對第2,3,4,5行進行選擇,對第二行的選擇次數,是源于第一行選擇完之后還有幾個滅著的燈。

因此,我們對上一行進行遍歷,如果_arr【i-1】【j】==0,就把time+1,同時點一下_arr【i】【j】。

注意:此時,time已經有可能超過6了,因此需要進行判斷。

void jud(int* choose){int _arr[5][5];memcpy(_arr, arr, 25 * 4);int time = 0;//對第一行進行操作int i = 0;//用于遍歷行int j = 0;//用于遍歷列for (j = 0; j < 5; j++){if (choose[j] == 1)//相當于arr【0】【j】被選擇了{time++;change(_arr, 0, j);}}//...//對2,3,4,5行進行操作for (i = 1; i < 5; i++){for (j = 0; j < 5; j++){if (_arr[i - 1][j] == 0){time++;if (time > 6){return;}change(_arr, i, j);}}}//...}

現在,我們已經對1 ~ 5行全部選擇完畢,但是不確定是否全部都為1,因此需要進行遍歷一次,一旦出現為0的情況,說明這種情況不可取,馬上返回。

//檢測數組中是否全部為1for (i = 0; i < 5; i++){for (j = 0; j < 5; j++){if (_arr[i][j] == 0){return;}}}//...//運行到這里,說明此種方案可行

對輸出數據的處理

題目要求我們輸出所有可行的方案中步數最少的一種所消耗的步數,如果沒有可行方案則返回-1。

因此,我們設置一個全局變量min_time并令其初始化為一個大于6的數,一旦出現一個time小于min_time,就把min_time更新為time。

如果還有更小的time,就能再次更新。

int arr[5][5];int choose[5];int min_time = 10;
//運行到這里,說明此種方案可行min_time = time;return;//...

隨后,我們進行最后的處理。

當dfs(0)結束之后,我們得到了一個min_time,因為它的初始值大于6,所以只要有可行方案存在,該值就一定會被改變,否則,它就依然還是原來的值。

所以,我們設置一個if語句,如果該值為10(初始值),代表沒有可行方案,打印-1后換行。

如果該值不等于10,就打印這個數后換行,代表最小步數為該值。

注意:因為min_time是我們在全局定義的,因此打印完了以后不要忘記再將其重新賦值為10哦。(博主改了很久才想到這一點,TAT)

int main(){int n = 0;scanf("%d", &n);while (n--){int i = 0;for (i = 0; i < 5; i++){int j = 0;for (j = 0; j < 5; j++){scanf("%1d", &arr[i][j]);}}dfs(0);if (min_time == 10){printf("-1\n");}else{printf("%d\n", min_time);min_time = 10;}}return 0;}

感謝您的閱讀與耐心~ 如有錯誤煩請指出~

關鍵詞: 編程算法

專題首頁|財金網首頁

投資
探索

精彩
互動

獨家
觀察

京ICP備2021034106號-38   營業執照公示信息  聯系我們:55 16 53 8 @qq.com  財金網  版權所有  cfenews.com
91精品久久久久久久久99蜜臂| 不卡电影一区二区三区| 日韩精品色哟哟| av毛片久久久久**hd| 成人免费在线视频观看| 欧美最猛性xxxxx直播| 欧美精品一区二区三区久久久| 午夜影院免费| 免费a级在线播放| av在线播放一区| 日韩久久综合| 久久精品国产99| 国产精品妹子av| 欧美精品亚洲一区二区在线播放| 国产一级性片| 黄色美女视频在线观看| 亚洲国产aⅴ精品一区二区| 亚洲一区二区三区| 国产馆精品极品| 天天免费综合色| 亚洲成人国产精品| 九色在线视频| 国产人与zoxxxx另类91| 黄色日韩在线| 久久久亚洲欧洲日产国码αv| 懂色aⅴ精品一区二区三区蜜月| 亚洲免费av网址| 97久久人人超碰caoprom| 亚洲精品**不卡在线播he| 奇米在线7777在线精品| 亚洲黄色在线视频| 日韩hd视频在线观看| 韩国成人免费视频| 成人久久综合| 99久久婷婷国产综合精品电影| 在线欧美日韩国产| 欧美大片aaa| www.豆豆成人网.com| 老司机免费视频久久| 国产精品国产三级国产aⅴ入口| 日韩区在线观看| 四虎亚洲精品| 影音先锋成人在线电影| 欧美经典一区二区| 亚洲欧美日韩国产精品| 欧美黑人猛交的在线视频| 欧美系列电影免费观看| 99久久久免费精品国产一区二区| 欧美一a一片一级一片| 国产精品一区二区婷婷| 欧美交a欧美精品喷水| 丁香婷婷综合激情五月色| 欧美日韩国产色站一区二区三区| 在线观看免费黄视频| a级日韩大片| 国产ts人妖一区二区| 欧美一区二区高清| 日本在线播放一二三区| 99热这里只有成人精品国产| 亚洲精品成人天堂一二三| 伊人网站在线| 九色成人国产蝌蚪91| 91女人视频在线观看| 亚洲欧美日韩中文在线| 日韩三区四区| 懂色av一区二区夜夜嗨| 精品国产乱码久久| 欧美电影在线观看网站| 紧缚奴在线一区二区三区| 欧美日产在线观看| 中文字幕在线免费观看视频| 青青草国产成人99久久| 欧美美女一区二区三区| 日韩欧美精品一区二区三区| 日韩av一二三| 精品国产一区二区亚洲人成毛片 | 在线xxxx| 国产一区二区三区的电影| 欧美性感美女h网站在线观看免费| 五月天婷婷在线视频| 欧美日韩国产在线一区| 欧美日韩国产综合新一区| av免费在线观看网址| 国产亚洲精品v| 宅男噜噜噜66一区二区66| 青草综合视频| 久久天天做天天爱综合色| 在线天堂av| 国产精品s色| 91精品国产综合久久小美女| 91麻豆精品一二三区在线| 91视频观看视频| 天堂91在线| 日韩香蕉视频| 欧美精品一区二区三区在线播放| 成人福利片在线| 久久久亚洲精品石原莉奈| 免费人成在线观看网站| 亚洲日本免费| 亚洲精品成a人在线观看| 成人中文字幕视频| 亚洲精品国产品国语在线app| 羞羞视频在线免费国产| 国产乱妇无码大片在线观看| 久久小说免费下载| 欧美区一区二| 日韩精品在线一区| 亚欧日韩另类中文欧美| 亚洲成a人在线观看| 韩日毛片在线观看| 久久综合色之久久综合| 麻豆传媒在线免费看| 蜜桃久久久久久久| 欧美激情图区| 亚洲黄色视屏| 独立日3在线观看完整版| 91精品久久久久久久蜜月| 欧美一区二区三区视频| 日韩精品免费一区二区三区竹菊| 精品国产乱码久久久久酒店| 成年永久一区二区三区免费视频| 亚洲人妖av一区二区| 国产一区二区三区朝在线观看| 中文字幕免费不卡| 亚洲一区资源| 欧美极品少妇xxxxⅹ高跟鞋| 极品视频在线| 国产精品久久久一区麻豆最新章节| av中文资源在线资源免费观看| 久久久www免费人成精品| 高清视频在线观看三级| 国产精品天干天干在观线| 深夜福利视频一区二区| 中文字幕视频一区二区三区久| 蜜桃视频成人m3u8| 亚洲曰韩产成在线| 在线日韩成人| 在线电影院国产精品| 区一区二视频| av免费高清观看| 日本vs亚洲vs韩国一区三区二区| 国产高清免费av在线| 成人精品视频一区二区三区| 第四色日韩影片| 亚洲一区二区在线播放相泽| 国产精品sss在线观看av| 日韩一级片在线播放| 在线播放日韩| 可以在线观看的黄色| 91亚洲精品乱码久久久久久蜜桃 | 亚洲人成绝费网站色www| 久久国产成人| 好操啊在线观看免费视频| 欧美激情一区二区在线| 国产成人午夜性a一级毛片| 色综合久久中文综合久久97| 日韩成人激情| 资源视频在线播放免费| 国产激情91久久精品导航| 中老年在线免费视频| 欧美性生交大片免网| 久久久五月天| 黄色国产在线| 自拍视频在线观看一区二区| 日韩高清影视在线观看| 亚洲欧洲成视频免费观看| 国产福利精品导航| 福利一区和二区| 日韩一区二区高清| 久久精品国产精品亚洲红杏 | 国模视频一区| 色妹子一区二区| 国内精品久久久久国产盗摄免费观看完整版| 在线麻豆国产传媒1国产免费| 久久综合九色综合欧美98| 综合成人在线| 日本三级电影网| 国产亚洲成aⅴ人片在线观看| 国产精品网址| 在线国产日本| 亚洲精品视频一区| 欧美黄色一级视频| a级影片在线观看| 欧美性色黄大片| 视频一区二区不卡| 超级碰碰久久| 欧美成va人片在线观看| 国产一区二区三区四区在线观看| av成人免费| 国产三级免费观看| 国产精品午夜免费| 一区二区蜜桃| 国产白浆在线免费观看| 精品少妇一区二区三区免费观看 | h网址在线观看| 中文字幕欧美一| 影音先锋中文字幕一区| h片在线观看下载| 亚洲国产精品高清久久久| 久久只精品国产|