題目描述:
你玩過「拉燈」遊戲嗎?25盞燈排成乙個5x5的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應:和這個燈上下左右相鄰的燈也要相應地改變其狀態。
我們用數字「1」表示一盞開著的燈,用數字「0」表示關著的燈。下面這種狀態
10111
01101
10111
10000
11011
在改變了最左上角的燈的狀態後將變成:
01111
11101
10111
10000
11011
再改變它正中間的燈後狀態將變成:
01111
11001
11001
10100
11011
給定一些遊戲的初始狀態,編寫程式判斷遊戲者是否可能在6步以內使所有的燈都變亮。
輸入格式
第一行輸入正整數n,代表資料中共有n個待解決的遊戲初始狀態。
以下若干行資料分為n組,每組資料有5行,每行5個字元。每組資料描述了乙個遊戲的初始狀態。各組資料間用乙個空行分隔。
輸出格式
一共輸出n行資料,每行有乙個小於等於6的整數,它表示對於輸入資料中對應的遊戲狀態最少需要幾步才能使所有燈變亮。
對於某乙個遊戲初始狀態,若6步以內無法使所有燈變亮,則輸出「-1」。
資料範圍
0輸入樣例:
300111
01011
10001
11010
11100
11101
11101
11110
11111
11111
01111
11111
11111
11111
11111
輸出樣例:32
-1
//演算法高階指南
/*遞推與遞迴
32*20*5*500 = 160 0000
*/#include
#include
#include
using
namespace
std;
#define inf 1000;
char g[10][10
];//
方向陣列 中上右下左 順時針方向
int dx[5] = , dy[5] = ;
void turn(int x, int y)//
設定開關
}}int
work()
}//從前往後 遞推前n-1行
for (int i = 0; i < 4; i++)}}
bool is_successful = true
;
for (int j = 0; j < 5; j++)
}if (is_successful == true)//
如果方案合法,則取出最小值
memcpy(g, backup,
sizeof(g));//
每一輪列舉結束之後,恢復記憶陣列
}
if (ans > 6)//
如果方案數目大於6,則不合法
return
ans;
}int
main()
return0;
}
95 費解的開關
簡單來說,這道題目是求我們最少需要多少步可以將所有的燈都開啟,也就是將矩陣全部變為1。對於我們開燈其實是有兩個屬性 1 開燈的順序是無所謂的 2 乙個格仔最多隻需要按一次 對於乙個5 5的矩陣,我們可以把每一行看作一串二進位制數,那麼我們就可以使用二進位制來表示當前這一行的所有按開關或不按開關的組合...
95 費解的開關
列舉第一行所有狀態,之後再下一行對於第一行每一種狀態進行處理,如果第一行對應 的列是0則必須在下一行按下對應的列,直至迴圈到第四行位置,這時如果第五行全部為1滿足條件 否則該方案不滿足條件 include includeusing namespace std const int inf 100000...
95 費解的開關
原題鏈結 include include include include using namespace std const int maxn 6 char state maxn maxn 儲存遊戲狀態的矩陣,使用char型別方便一次輸入一行 char backup maxn maxn 用於備份遊戲...