地圖塗色問題

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章