poj1753 广搜

来源:互联网 发布:怎么安装虚拟机linux 编辑:程序博客网 时间:2024/04/30 19:27

//////////////////////////////////////////////////////////////////////////////////////////////////////

广搜,方法比较笨

/////////////////////////////////////////////////////////////////////////////////////////////////////

#include<iostream>

#include<bitset>


using namespace std;


struct Node{
bool line[6][6];
int nodeFlags;
int getNodeFlags(){
int n = 0;
int circle = 0;
for(int i = 1;i < 5;i++)
{
for(int j = 1;j < 5; j++)
{
if(line[i][j])
{
n += pow(2.0,circle);
}
circle++;
}
}
return n;
}
int step;
Node(){};
};
bitset<100000> Flags;
Node myQueue[400000];
int pHead;
int pTail;
bool whetherRight(Node s)
{
bool wFlag = 1;
bool bFlag = 1;
for(int i = 1;i < 5;i++)
{
for(int j = 1;j < 5;j++)
{
if(s.line[i][j] == 0)
bFlag = 0;
if(s.line[i][j] == 1)
wFlag = 0;
}
}
return (wFlag || bFlag);
}
Node getNewNode(Node s,int line,int rank)
{
s.line[line][rank] = !s.line[line][rank];
s.line[line - 1][rank] = !s.line[line - 1][rank];
s.line[line + 1][rank] = !s.line[line + 1][rank];
s.line[line][rank - 1] = !s.line[line][rank - 1];
s.line[line][rank + 1] = !s.line[line][rank + 1];
s.step++;
return s;
}
int Bfs(Node start)
{
Flags.reset();
if(whetherRight(start))
return 0;
pHead = 0;
pTail = 1;
myQueue[pHead] = start;
while(pHead != pTail)
{
for(int i = 1;i < 5;i++)
{
for(int j = 1;j < 5;j++)
{
Node newNode = getNewNode(myQueue[pHead],i,j);
if(Flags[newNode.getNodeFlags()])
continue;
if(whetherRight(newNode))
return newNode.step;
Flags.set(newNode.getNodeFlags(),true);
myQueue[pTail++] = newNode;
}
}
pHead++;
}
return -1;
}
int main(){
Node start;
start.step = 0;
for(int i = 1;i < 5;i++)
{
for(int j = 1;j < 5;j++)
{
char sTmp;
cin >> sTmp;
if(sTmp == 'b')
start.line[i][j] = 1;
else
start.line[i][j] = 0;
}
}
int res = Bfs(start);
if (res == -1)
cout << "Impossible" <<endl;
else
cout<< res << endl;
}
0 0
原创粉丝点击