poj 1753,題目連結翻譯一下整個題目的大概意思:
有4*4的正方形,每個格子要麼是黑色,要麼是白色,當把一個格子的顏色改變(黑->白或者白->黑)時,其周圍上下左右(如果存在的話)的格子的顏色也被反轉,問至少反轉幾個格子可以使4*4的正方形變為純白或者純黑?
主要思路如下:
1.對於每個格子,它要麼反轉0次,要麼反轉1次(當然,它的鄰格子也跟著反轉),因為它反轉偶數次和反轉0次的效果是一樣的,同理反轉奇數次的效果和反轉1次的效果是一樣的。
2.由於只有16個格子,我們可以選擇0個格子,1個格子,2個格子,3個格子......進行反轉,總的選擇情況為
3.當0個格子被反轉時,看它是否為純色,否則選擇一個格子進行反轉(有16種選擇),看反轉後是否為純色,否則選擇兩個格子進行反轉(有120種選擇),看反轉後是否為純色......
4.只要"3過程"中有純色出現,就停止"3過程",輸出相應的被選擇的格子個數,結束。如果16個格子都被翻轉了,還是沒變成純色,則輸出“impossible”。
對於從16個格子中選取n個格子的所有組合,請看前一篇文章從陣列中取出n個元素的所有組合(遞迴實現),這裡不再敘述。
1 #include 2 #include 31、函式宣告//所有都是白的,或者所有都是黑的
4int all_white_or_black(int* bits, int
len)512
//改變一個格子的顏色,並根據其所在位置改變其周圍格子的顏色
13void change_color(int* arr, int
i)14
2728
void combine(int* arr, int len, int* result, int count, const
int num, int*last)
2948
if (all_white_or_black(new_arr, 16
))49
54free
(new_arr);55}
56}57}
5859
intmain()
6076}77
78if (all_white_or_black(bits, 16
))79 printf("
%d\n
", 0
);80
else
81100
//new_bits已被改變,所以要還原為bits
101for (i = 0; i < 16; i++)
102 new_bits[i] =bits[i];
103104
free
(result);
105}
106free
(new_bits);
107108
if (j == 17
)109 printf("
impossible\n");
110}
111return0;
112 }
void *malloc(int size);
說明:malloc向系統申請分配size位元組的記憶體空間,返回型別為void*型別。
2、使用
int *p;
p = (int *)malloc( sizeof(int) );
注意:(1)因為malloc返回的是不確定型別的指標,所以返回之前必須經過型別強制轉換,否則編譯報錯,如:“ 不能將void*賦值給int*變數 ”。
(2)malloc只管分配記憶體,並不會初始化,其記憶體空間中的值可能是隨機的。如果分配的這塊空間原來沒有被使用過,那麼其中每個值都可能是0。相反,空間裡面可能遺留各種各樣的值。
(3)實參為需要分配的位元組大小,如果malloc(1),那麼系統只分配了1個位元組的記憶體空間,這時注意,如果在這塊空間中存放一個int值,由於int型別佔4個位元組,那麼還有3個位元組未分配空間,系統就會在已經分配的那1個位元組的基礎上,依次向後分配3個位元組空間,而這就佔有了“別人”的3個位元組空間,“別人”原有的值就被清空了。
(4)分配的空間不再使用時,要用free函式釋放這塊記憶體空間。
3、示例
分配100個int型別的空間:
int *p;
p = (int *)malloc( sizeof(int) * 100 );
POJ1753 Flip Game
題目大意 給你一個4 4的矩陣,矩陣裡面儲存著棋子,棋子有黑色,和白色,你可以任意改變位置 i,j 的棋子,但是規則是這個位置的上下左右的棋子顏色都必須改變。求最少需要改變幾顆棋子,使得棋盤的棋子都為白的或都為黑色。 解題思路 列舉 dfs。 因為棋盤就16位所以,最多改變16個棋子。列舉每一種至少...
Poj1753 翻轉棋子
這個題就是用列舉舉遍所有情況,然後一個一個深搜看看是不是符合條件,符合條件直接退出,不符合則繼續, 由於 只有16個所以可以得知最多的步數只能是16,所以可以根據步數從0到16依次列舉, 第一個符合條件的就是最小的步數,為了容易深搜,可以設定順序為一行一行深搜,當一行搜完時從下一行開頭搜, 和測試數...
poj 1753
題意 給定4 4的矩形 由16個矩形組成 上面由w或b 組成 背面相反 每次能翻轉3到5個小矩形 求最少的步數能使矩形全部為w或全部為b 思路 有固定的2 16次方個狀態 也就是矩形的子集的個數 列舉所有的狀態就可以了 includeusing namespace std int arr 26 in...