POJ 1753 棋盘反转(位运算+BFS)


#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

#define ROW 1
#define COL 2
#define MAX 6
#define ENDSTATE ((1<<16)-1)

const int dir[5][3] = { {0,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1} };

int arr[MAX][MAX];
int chess[MAX][MAX];
int change[17];
bool visit[(1 << 16)];

int initVal = 0;


struct Node{
    
    Node():state( 0 ),step( 0 ){};
    Node(int sa,int se):state( sa ),step( se ){};
    
    int state;
    int step;
    
};


void getChange(){
    
    int index = 1;
    memset( arr, 0, sizeof( arr ) );
    
    for( int i = 1;i <= 4; ++i ){
        for( int j = 1;j <= 4; ++j ){
            
            int temp = 0;
            
            for( int k = 1;k <= 4; ++k ){
                arr[i + dir[k][ROW]][j + dir[k][COL]] = 1;
            }
            
            arr[i][j] = 1;
            
            for( int m = 1;m <= 4; ++m ){
                for( int n = 1;n <= 4; ++n ){
                    temp <<= 1;
                    if( arr[m][n]==1 ) 
                        temp += 1;
                }
            }
            
            change[index] = temp;
            index++;
            memset( arr, 0, sizeof( arr ) );
        }
    }
}


int BFS(){
    
    queue<Node>Q;
    Node cur( initVal, 0 );
    visit[initVal] = true;
    
    Q.push( cur );
    
    while( !Q.empty() ){
        
        Node temp = Q.front();
        Q.pop();
        
        if( temp.state == 0 || temp.state == ENDSTATE )
            return temp.step;
            
        for( int i = 1; i <= 16; ++i ){
            
            Node nextNode;
            int val = temp.state ^ change[i];
            
            if( visit[val] == true )
                continue;
                
            nextNode.state = val;
            nextNode.step  = temp.step + 1;
            visit[val]     =true;
            
            Q.push( nextNode );
        }
    }
    
    return -1;
}


int main(){
    
    getChange();
    
    memset( visit, false, sizeof( visit ) );
    bool label = false;
    int base;
    
    for( int i = 1; i <= 4; ++i ){
        for( int j = 1; j <= 4; ++j ){
            
            initVal <<= 1;
            char c;
            cin >> c;
            
            if( c == 'b' ) 
                initVal += 1;
        }
    }
    
    int step = BFS();
    
    if( step == -1 )
        cout << "Impossible" << endl;
    else
        cout << step << endl;
        
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值