關燈問題(黑白棋) (狀態壓縮 dfs)

2021-09-22 20:19:05 字數 1168 閱讀 6178

農夫約翰知道,一頭智力滿意的牛是一頭快樂的母牛,它會提供更多的牛奶。他為牛安排了一項聰明的活動,它們在其中操縱m × n網格(1≤m≤15;1≤n≤15)方形瓷磚,每一塊都是黑色的,另一邊是白色的。

正如人們所猜測的那樣,當乙個白色的瓷磚被翻轉時,它會變成黑色的;當乙個黑色的瓷磚被翻轉時,它就會變成白色的。牛群在翻轉瓷磚時會得到獎勵,這樣每個瓷磚都有白色的一面朝上。然而,母牛有相當大的蹄子,當他們試圖翻轉乙個特定的瓷磚,他們也翻轉所有相鄰的瓷磚(與翻轉的瓷磚有乙個完整的邊緣)。由於翻轉是累人的,奶牛希望儘量減少它們必須做的翻轉的數量。

幫助奶牛確定所需的最小翻轉次數,以及翻轉的位置以達到這個最小值。如果有多種方法可以最小的翻轉量完成任務,則返回輸出中字典順序最少的方法,當將其視為字串時。如果任務是不可能的,用「不可能」一詞列印一行。

輸入第1行:兩個空格分隔的整數:m和n

第2行.。m+1:一行i+1描述網格第一行的顏色(從左到右)n空格分隔的整數,黑色為1,白色為0。

輸出量第1行.。m*每一行包含n空格分隔整數,每個整數指定翻轉該特定位置的次數。

樣本輸入

4 4

1 0 0 1

0 1 1 0

0 1 1 0

1 0 0 1

樣本輸出

0 0 0 0

1 0 0 1

1 0 0 1

0 0 0 0

#include#include//如果乙個棋子反轉了兩次,那麼就相當於沒有反轉,所以每個棋子最多反轉一次才可求最小反轉數 

int h,w,map[30][30],temp[30][30],m[30][30];

//map陣列記錄棋子的初始情況,temp陣列記錄每個點的反轉數,m陣列記錄最小反轉數時的每個點的反轉數;

int next[5][2]=,,,,};

//判斷此點是否是黑棋,此點的黑與白有上下左右四個和其自己本身反轉次數有關;

int judge(int x,int y)

int num=dfs();//num記錄當下方案的總反轉數

if(num>0&&(min<0||min>num))

} if(min==-1)

else

} return 0;

}

黑白棋求使新狀態己方子最多的落子位置

描述下面我們來編寫黑白棋的乙個比較重要的模組,對於某個棋盤狀態,我們將要下乙個子時,最樸素的考慮就是我下了這個子後棋盤上我方顏色的子盡量的多 如果大家對於黑白棋有一定研究,會發現這樣走並不優 我們這裡要求大家程式設計實現找出可以使我方下完乙個子後,棋盤上的我方顏色的子最多的位置,如果有多個這樣的位置...

洛谷 2622 關燈問題II 狀態壓縮

題目描述 現有n nn盞燈,以及m mm個按鈕。每個按鈕可以同時控制這n nn盞燈 按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一 如果a i j a i j a i j 為11 1,那麼當這盞燈開了的時候,把它關上,否則不管 如果為 1 11的話,如果這盞燈...

P2622 關燈問題II 狀態壓縮入門

具體思路 暴力,嘗試每個開關,然後看所有的情況中存不存在燈全部關閉的情況,在儲存所有燈的情況的時候,觀察到n的值不大,所以可以考慮用二進位制進行儲存,如果說這個數用二進位制表示的時候,如果第i位是1,代表第 i 1 個燈當前的狀態是開著的,否則就是關閉的.ac include include inc...