poj1753

2022-08-05 15:51:20 字數 2242 閱讀 4615

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 3

//所有都是白的,或者所有都是黑的

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 }

1、函式宣告

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...