poj1753

#include <iostream>
using namespace std ;
int Map , change_s;
bool isAC ;
void change(int ID)
{
	if(ID % 4 != 1)    //左边 
	{
		Map = Map ^ (1 << (16 - (ID-1))) ;
	}
	if(ID % 4 !=0)    //右边 
	{
		Map = Map ^ (1 << (16 - (ID+1))) ;
	}
	if(ID > 4)    //上边 
	{
		Map = Map ^ (1 << (16 - (ID-4)));
	}
	if(ID < 13)    //下边 
	{
		Map = Map ^ (1 << (16 - (ID+4))) ;
	}
	Map = Map ^ (1 << (16 - (ID))) ;
}
void dfs(int ID , int deep)//ID为翻哪一个棋  deep为以翻了几个棋 
{
	if(deep == change_s)   //是否已翻了change_s个棋子 
	{
		if(Map == 0 || Map == 65535) isAC = true ;  //是否以达到要求 
		return ;
	}
	if(ID > 16) return ;   //翻到了结尾 
	change(ID); //翻棋 
	dfs(ID+1 , deep + 1) ;   //翻下一个 
	if(!isAC)
	{
		change(ID) ;     //翻回来 
		dfs( ID+1 , deep) ;   //重新翻一个 
	}
}
int main()
{
    int i ;
    char c ;
    Map = 0 ;
    for( i = 0 ; i < 16 ; i++)
    {
        cin >> c ;
        if(c == 'b')
        {
            Map = Map | (1 << (15-i)) ;
        }
    }
    isAC =  false ;
    for( change_s = 0 ; change_s <= 16 ; change_s ++)
    {
    	dfs(1 , 0) ;
    	if(isAC) break;
    }
	if(isAC)
	{
		cout << change_s << endl ;
	}
	else
	{
		cout << "Impossible" << endl ;
	}
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ly1390811049/article/details/50879741