#include <iostream>
#include<list>
#include<string>
using namespace std;
int **Neighbours;
int N;
void init()
{
cin>>N;
if(N>50)
{
cout<<"out of range"<<endl;
return;
}
Neighbours= new int*[N];
for(int i=0;i<N;i++)
{
Neighbours[i]=new int[N];
}
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
Neighbours[i][j]=0;
string s;
int a, b;
int coun=0;
while(!(s=="END"))
{
cin>>a>>b>>s;
Neighbours[a][b]=1;
Neighbours[b][a]=1;
}
}
class Block
{
public:
int Colors[4];
int PreviousColors[4];
int BlockId;
int colorId;
bool NoRemainingColour();
void TellNeighbours(int ColorIndex,list<Block> &blocks);
void RecoverNeighbours(int ColorIndex,list<Block>&blocks);
Block(int id)
{
BlockId=id;
colorId=-1;
for(int i=0;i<4;i++)
{
Colors[i]=0;
PreviousColors[i]=0;
}
}
};
class Map{
public:
list<Block> blocks;
void Initialize();
bool DrawMap(int BlockIndex);
void showResult();
};
static int count=0;
bool Map::DrawMap(int BlockIndex=0)
{
list<Block>::iterator it;
int i=0;
for(it=blocks.begin();it!=blocks.end();it++)
{
if(BlockIndex==(*it).BlockId)
{
break;
}
}
if(!(*it).NoRemainingColour())
{ for(i=0;i<4;i++)
{
if((!(*it).Colors[i])&&((!(*it).PreviousColors[i])) )
{
(*it). TellNeighbours(i,blocks);
break;
}
}
if(i==4)
{
return false;
}
it++;
if(it==blocks.end())
{
return true;
}
if(!DrawMap((*it).BlockId))
{
it--;
(*it). RecoverNeighbours(i,blocks);
cout<<"kehua"<<(*it).BlockId<<endl;
DrawMap((*it).BlockId) ;
}
else
{
return true;
}
}
else
{
return false;
}
}
void Map::Initialize()
{
init();
while (count<N)
{
Block a(count);
cout<<count<<endl;
blocks.push_back(a);
count++;
}
}
void Map::showResult()
{
list<Block>::iterator it;
for(it=blocks.begin();it!=blocks.end();it++)
{
cout<<"Nodeid :"<<(*it).BlockId<<" color"<<(*it).colorId <<endl;
}
}
bool Block::NoRemainingColour()
{ int i=0;
for( i=0;i<4;i++)
{
if(Colors[i]==0)
{
return false;
}
}
if(i==4)
{
return true;
}
return false;
}
void Block::TellNeighbours(int colorindex,list<Block> &blocks)
{
list<Block>::iterator it;
colorId=colorindex;
PreviousColors[colorindex]=1;
for(it=blocks.begin();it!=blocks.end();it++)
{
if(BlockId==(*it).BlockId)
{
break;
}
}
list<Block>::iterator its;
for(int i=0;i<N;i++)
{
if(Neighbours[BlockId][i])
{
for(its=it;its!=blocks.end();its++)
{
if((*its).BlockId==i)
{
(*its).Colors[colorindex]=1;
}
}
}
}
}
void Block::RecoverNeighbours(int ColorIndex,list<Block>&blocks)
{
colorId=-1;
list<Block>::iterator it;
for(it=blocks.begin();it!=blocks.end();it++)
{
if(BlockId==(*it).BlockId)
{
break;
}
}
list<Block>::iterator its;
for(int i=0;i<N;i++)
{
if(Neighbours[BlockId][i])
{
for(its=it;its!=blocks.end();its++)
{
if((*its).BlockId==i)
{
(*its).Colors[ColorIndex]=0;
}
}
}
}
}
int main()
{
Map m;
m.Initialize();
m.DrawMap();
m.showResult();
return 0;
}
地图涂色问题
最新推荐文章于 2023-05-05 23:40:08 发布