标签:
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)
Total Submission(s): 830 Accepted Submission(s): 325
#include <bits/stdc++.h> using namespace std ; typedef pair<int,int> pii ; #define X first #define Y second const int N = 1<<16; int n ; string s , s2 ; struct node { int w , st ; node(){} node( int w , int st ):w(w),st(st){} bool operator < ( const node &a ) const { return w > a.w ; } }; void update( int &st , int i , int j , bool tag ) { if( ( st & ( 1<<j ) ) && s[j] != s[i] ) st ^= (1<<j) ; if( !( st & ( 1<<j ) ) && s[j] == s[i] ) st |= (1<<j) ; if( !tag ) return ; if( ( st & ( 1<<((j+n)%(2*n)) ) ) && s[(j+n)%(2*n)] != s[i] ) st ^= (1<<((j+n)%(2*n)) ); if( !( st & ( 1<<(j+n)%(2*n)) ) && s[(j+n)%(2*n)] == s[i] ) st |= (1<<((j+n)%(2*n)) ) ; // cout << j << ‘ ‘ << (j+n)%(2*n) << endl ; } void show( int st ) { for( int i = 0 ; i < n ; ++i ) if( st&(1<<i) ) cout << ‘1‘ ; else cout << ‘0‘ ; cout << endl ; for( int i = n ; i < 2*n ; ++i ) if( st&(1<<i) ) cout << ‘1‘ ; else cout << ‘0‘ ; cout << endl ; } int dis[N] , all ; void bfs( ) { priority_queue<node>que; que.push( node(0,0) ) ; memset( dis , 0x3f , sizeof dis ); dis[0] = 0 ; // cout << all << endl ; while( !que.empty() ) { int uw = que.top().w , ust = que.top().st ; que.pop(); if( dis[ust] < uw ) continue ; // cout << uw << endl ; show( ust ); cout << endl ; if( ust == all ) return ; int vw = uw + 1 , vst , vst2 ; for( int i = 0 ; i < n ; ++i ) if( !( ust&(1<<i)) ) { vst = ust , vst2 = ust ; for( int j = i ; j < n ; ++j ) { // single line update( vst , i , j , false ); update( vst2 , i , j , true ); if( vw < dis[vst] ) { // cout << i << ‘ ‘ << vst << endl ; // show( vst ); cout << endl ; dis[vst] = vw ; que.push( node( vw , vst ) ) ; } if( vw < dis[vst2] ) { // show( vst2 ); cout << endl ; dis[vst2] = vw ; que.push( node( vw , vst2 )); } } vst = ust , vst2 = ust ; for( int j = i ; j >= 0 ; --j ) { update( vst , i , j , false ); update( vst2 , i , j , true ); if( vw < dis[vst] ) { // show( vst ); cout << endl ; dis[vst] = vw ; que.push( node( vw , vst ) ) ; } if( vw < dis[vst2] ) { // show( vst2 ); cout << endl ; dis[vst2] = vw ; que.push( node( vw , vst2 )); } } } for( int i = n ; i < 2 * n ; ++i ) if( !( ust&(1<<i)) ) { vst = ust , vst2 = ust ; for( int j = i ; j < 2 * n ; ++j ) { // single line update( vst , i , j , false ); update( vst2 , i , j , true ); if( vw < dis[vst] ) { // show( vst ); cout << endl ; dis[vst] = vw ; que.push( node( vw , vst ) ) ; } if( vw < dis[vst2] ) { // show( vst2 ); cout << endl ; dis[vst2] = vw ; que.push( node( vw , vst2 )); } } vst = ust , vst2 = ust ; for( int j = i ; j >= n ; --j ) { update( vst , i , j , false ); update( vst2 , i , j , true ); if( vw < dis[vst] ) { // show( vst ); cout << endl ; dis[vst] = vw ; que.push( node( vw , vst ) ) ; } if( vw < dis[vst2] ) { // show( vst2 ); cout << endl ; dis[vst2] = vw ; que.push( node( vw , vst2 )); } } } } } int Run() { int _ , cas = 1 ; cin >> _ ; while( _-- ) { cout << "Case #" << cas++ <<": " ; cin >> n >> s >> s2 ; s += s2 ; all = (1<<(n*2))-1; bfs(); // cout << dis[45] << endl ; cout << dis[all] << endl ; } return 0 ; } int main() { // freopen("in.txt","r",stdin); ios::sync_with_stdio(0); return Run(); }
HDU 4012 Paint on a Wall(状压+bfs)
标签:
原文地址:http://www.cnblogs.com/hlmark/p/4353852.html