poj 1753,題目鏈結
有4*4
的正方形,每個格仔要麼是黑色,要麼是白色,當把乙個格仔的顏色改變(黑
->
白或者白
->黑)
時,其周圍上下左右
(如果存在的話
)的格仔的顏色也被反轉,問至少反轉幾個格仔可以使
4*4的正方形變為純白或者純黑?
1. 每乙個位置只有兩種顏色,翻偶數次等於沒有翻,所以只有翻基數次對棋盤有影響,即只用考慮乙個位置最多翻一次。
2. 一共有
16個位置,所以最多翻
16次。那麼可能翻
0次就成功、或者翻
1次成功、或者翻
2次成功
...或者翻
16次成功。
3. 每個位置翻轉的順序對結果無影響。
那麼這就變成了乙個組合數問題:
將輸入的16
個元素放到乙個陣列中,進行組合數計算即可。(組合數
+列舉)
/*
* memory: 384k
* time: 16ms
*/#include #include #define allnum 16
static int count = 0;
/** 15 14 13 12
* 11 10 9 8
* 7 6 5 4
* 3 2 1 0
*/void flip(int& data, int posidx)
bool isok(int data)
/** num 1 -- allnum
* staridx 0 -- allnum-1
*/void func(int num, int staridx, int data, int step)
}// black 0, white 1
int main()
void flip(int& data, int posidx)
// black 0, white 1
int main()
int step = allnum;
bool bimpossible = true;
for (int i=0; i<=0xffff; ++i)
}if (isok(tempdata) && tempstep < step) step = tempstep;
} if (step == allnum)
printf("impossible\n");
else
printf("%d\n", step);
return 0;
}
poj1753解題報告
1.演算法 核心是寬度優先搜尋和位處理。要找出最快的步數,用寬搜。1 寬度優先搜尋資料結構 佇列的單元unit包含x 用int的末16位記錄16個位置的資訊 rounds 記錄第幾輪達到當前的狀態 i 記錄該狀態是通過翻動哪個棋子得來的,以避免返回先前的狀態 queue是乙個佇列,記錄所有狀態 p,...
poj1753 搜尋,列舉法
1 2014.3.1 2 poj175334 5 題意 6 給你乙個4 4的黑白棋盤,通過翻棋子使棋盤變為全白或全黑,7 以下 翻乙個位置 皆指翻著個位置和它周圍的四個棋子。8 翻子時四周的四個棋子如果存在的話顏色也會跟著改變。9 問最少需要多少步可以使棋盤變為一種顏色。10 11 思路 12 每一...
列舉演算法思路訓練 poj1753
從知乎找到乙份訓練大綱,先按照這個練習吧 poj1753 大意是4 4的棋盤上,不斷黑白面的翻 己和上下左右 如果有棋子的話 如果有可能翻到只有一種顏色,那麼算出來最少翻幾個棋子就可以做到只有一種顏色 列舉的思想是不斷地猜測,從可能的集合中一一嘗試,然後再判斷題目的條件是否成立。oiwiki是這麼說...