開關反轉問題下的狀態壓縮 poj

2021-09-12 18:32:10 字數 1747 閱讀 4063

列舉第一行,我們可以知道的是,我們總可以通過辦法,使得前n-1行成為全白色。

我們如果挨個考慮的話,每一塊都跟四塊有關,並不好規劃。

我們就可以從同一列出發,自己頭上的那一塊,總可以通過自己來變成白色。

所以我們就可以通過確定第一行,從而確定整個反轉情況

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define up(i,a,b) for(int i=a;i#define dw(i,a,b) for(int i=a;i>b;i--)

#define upd(i,a,b) for(int i=a;i<=b;i++)

#define dwd(i,a,b) for(int i=a;i>=b;i--)

//#define local

typedef

long

long ll;

const

double esp =

1e-6

;const

double pi =

acos(-

1.0)

;const

long

long inf =

0x3f3f3f3f

;using

namespace std;

typedef pair<

int,

int> pir;

int m, n;

int grp[20]

[20];

int flip[20]

[20];

int out[20]

[20];

int tox[5]

=;//座標增量

int toy[5]

=;const

int inf =

1<<25;

intget

(int x,

int y)

}return sum %2;

//翻偶數次,和沒有翻一樣的效果就是白色了。

}int

solve()

}}up(i,

0, n)

int res =0;

up(i,

0, m)

}return res;

//算出總的反轉次數

}int

main()

}bool flag =

false

;int res =-1

;//for (int i = ((1<=0; i--)

//// int num = solve();

// if (num!=inf&&(res==-1||num<=res))

// //}

int num =0;

int ans =-1

;for

(int i =

0; i <

1<< n;

++i)}if

(!flag)

cout <<

"impossible"

//if (i < m - 1)

puts(""

);}}

return0;

}

poj3276 反轉 開關問題

題目大意 給你乙個長度為n的字串,包含字母f和b 你可以把區間k 乙個常數 內的所有f變成b,b變成f。為了把這個字串都變成f,求變化的最小次數和其對應的k的值 分析 挑戰程式設計競賽 反轉法的例題,此做法非書上做法 列舉k,對於每個k,只要序列最左端的b變成f,然後依次變化,得到答案 列舉起點然後...

poj 3276 反轉開關問題 一 DP 模擬

sample input 7bb fbfb b sample output 3 3 窮舉肯定是要超時的 2 n個狀態.但是先思考一些規律吧 1 轉動奇數次,必然與初始方向相反 2 轉動偶數次,必然與初始方向相同 列舉k 1 n,得到o n 3 的 這個 會超時,只是模擬而已 tle o n 3 in...

POJ1753 狀態壓縮( BFS) 棋盤問題

棋盤問題,改變乙個子的顏色,這個子以及這個子周圍的四個位置 左右上下 的子分別變色,求最少的改變次數。此類題大部分應該可以用狀態壓縮 暴力搜尋解決。純粹找規律不太合理。1 第一種方法,狀態壓縮後bfs暴力搜尋。因為棋盤很小,只有16個格仔,列舉所有的狀態共有2 16 65536種。所以有可以用int...