大致就是用BFS搜索所有情况,每次找到 当前状态下所能框住的最多多少个同类的字母,然后将这些标记并入当前状态,存入队列。
最后表示状态的时候状态压缩就行。。。。
话说这题做的时候有个坑。。。。当时初始化的时候 sizeof()里面写成了false而不是mark
哎。。。。混混成成的果然是天坑啊 啊啊啊啊啊啊,找了一晚上的bug
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <string>
using namespace std;
typedef struct{
int val, step;
}Node;
int N;
bool mark[1<<16];
char maps[20];
int BFS(){
queue<Node> q;
while( !q.empty() ){
q.pop();
}
memset( mark, false, sizeof( mark ) );
mark[0] = true;
Node start;
start.val = start.step = 0;
q.push( start );
while( !q.empty() ){
Node n = q.front();
q.pop();
if( n.val == ( ( 1 << (2*N) ) - 1 ) ){
return n.step;
}
for( int i = 0; i < 2 * N; i++ ){
if( n.val & ( 1 << i ) ){
continue;
}
int temp = 0;
for( int j = i; j < ( i / N + 1 ) * N; j++ ){
if( n.val & ( 1 << j ) ){
break;
}
if( maps[j] == maps[i] ){
temp |= ( 1 << j );
}
}
for( int j = i - 1; j >= ( i / N ) * N; j-- ){
if( n.val & ( 1 << j ) ){
break;
}
if( maps[j] == maps[i] ){
temp |= ( 1 << j );
}
}
for( int j = temp; j; j = temp & ( j - 1 ) ){
if( mark[n.val|j] ){
break;
}
Node newnode;
newnode.step = n.step + 1;
newnode.val = ( j | n.val );
mark[newnode.val] = true;
q.push( newnode );
}
if( i >= N ){
continue;
}
if( n.val & ( 1 << ( i + N ) ) ){
continue;
}
/////////////////////////////////////////////////////////////////////////////////////////
temp = 0;
for( int j = i; j < N; j++ ){
if( ( n.val & ( 1 << j ) ) || ( n.val & ( 1 << ( j + N ) ) ) ){
break;
}
if( maps[j] == maps[i] ){
temp |= ( 1 << j );
}
if( maps[j+N] == maps[i] ){
temp |= ( 1 << ( j + N ) );
}
}
for( int j = i - 1; j >= 0; j-- ){
if( ( n.val & ( 1 << j ) ) || ( n.val & ( 1 << ( j + N ) ) ) ){
break;
}
if( maps[j] == maps[i] ){
temp |= ( 1 << j );
}
if( maps[j+N] == maps[i] ){
temp |= ( 1 << ( j + N ) );
}
}
for( int j = temp; j; j =temp & ( j - 1 ) ){
if( mark[n.val|j] ){
continue;
}
Node newnode;
newnode.step = n.step + 1;
newnode.val = ( j | n.val );
mark[newnode.val] = true;
q.push( newnode );
}
////////////////////////////////////////////////////////////////////////////////////////
}
}
return -1;
}
int main(){
int T, Case = 1;
cin >> T;
while( T-- ){
cin >> N;
scanf( "%s%s", maps, maps + N );
cout << "Case #" << Case++ << ": " << BFS() << endl;
}
return 0;
}