Checker Challenge chapter 1.5

  思路还是比较清晰,自己写的dfs最后一个超时,还得跑到nocow看题解,大牛门不愧是大牛,我用几十行判断能否placequeue,大牛们一句话就完了...看来还是多看看别人的思路,

不想改了,感觉该就得重写,贴个自己的代码在贴个大牛的,用大牛的过了先...

 

/*

ID: hubiao cave

PROG: checker

LANG: C++

*/




#include<iostream>
#include<fstream>
#include<string>
#include<cstring>
#include<list>
using namespace std;

struct broad
{
    int column[15];
};

list<broad> li;
int count;
int*xie;
int cb[15][15];

int threetimez=0;

int temp[15];

void proc(int row,int column);
bool Canplace(int ,int);
int main()

{

    ifstream fin("checker.in");
    ofstream fout("checker.out");
    fin>>count;
    xie=new int[(count-2)*4+2+2];
    memset(xie,0,(count-2)*4+2+2);

    proc(1,0);
    list<broad>::iterator it=li.begin();
    int m=3;
    while (m>0)
    {
        int flag=0;
        for(int i=1;i<=count;i++)
        {
            if(!flag)
            {
                fout<<it->column[i];
                flag=1;
            }
            else
            {
                fout<<" "<<it->column[i];
            }
        }
        fout<<endl;
        it++;
        m--;
    }
    fout<<threetimez<<endl;
    return 0;

}

void proc(int row,int column)
{
    if(row==1)
    {
        for(int i=1;i<=count;i++)
        {
            cb[row][i]=1;
            temp[row]=i;

            if(i==1)
                xie[3*count-4]=1;
            if(i==count)
                xie[count-2+1]=1;
            if(i>1&&i<count)
            {
                xie[i-1]=1;
                xie[3*count-4+i-1]=1;
            }
    
            proc(row+1,i);
            cb[row][i]=0;


            if(i==1)
                xie[3*count-4]=0;
            if(i==count)
                xie[count-2+1]=0;
            if(i>1&&i<count)
            {
                xie[i-1]=0;
                xie[3*count-4+i-1]=0;
            }



        }
    }
    if(1<row&&row<count)
    {
        for(int i=1;i<=count;i++)
        {
            if(Canplace(row,i))
            {

                cb[row][i]=1;
                temp[row]=i;

                xie[row-1+i-1]=1;
                xie[3*count-4-row+1+i-1]=1;

                proc(row+1,i);
                cb[row][i]=0;


                xie[row-1+i-1]=0;
                xie[3*count-4-row+1+i-1]=0;
            }
            
            
        }
    }

    if(row==count)
    {
        for(int i=1;i<=row;i++)
        {
          if(Canplace(row,i))
          {
              threetimez++;
              if(threetimez<=3)
              {
              temp[row]=i;
              broad br;
              memcpy(br.column,temp,4*15);
              li.push_back(br);
              }

             
          }
        }
    }
}
bool Canplace(int row ,int column)
{
    for(int i=1;i<row;i++)
    {
        if(cb[i][column])
            return false
        else
        {
            if(i+c)
        }
    }
    /*for(int i=1;i<row;i++)
    {
        if(cb[i][column])
            return false;
    }

    if(row<count)
    {
        if(xie[row-1+column-1]==1||xie[3*count-4-row+1+column-1]==1)
            return false;
        else
            return true;
    }

    if(row==count)
    {
        if(column==1)
        {
            if(xie[count-1]==1)
                return false;
            else 
                return true;
        }
        if(column==count)
        {
            if(xie[3*count-4]==1)
                return false;
            return true;
        }
        if(column<count&&column>1)
        {
            if(xie[count-1+column-1]==1||xie[2*count-3+column-1]==1)
                return false;
            return true;
        }
    }
    return true;*/
}

大牛的

#include<iostream>
#include<fstream>
#include<memory.h>
using namespace std;
ifstream fin("checker.in");
ofstream fout("checker.out");
int N;
int tot=0;
int C[255];
int vis[3][255];//这个如果是用[3][14]的话,可能会产生缓冲区溢出。。我懒得试了 就开个大的。。最后还只是用了3K多Kb
void search(int cur)
{
    int i,j;
    if(cur==N) 
    {
        tot++;
        if(tot<4)
        {    
            for(int n=0;n<N-1;n++)
                fout<<C[n]<<" ";
            fout<<C[N-1]<<endl;
        }
 
    }
    else 
        for(i=0;i<N;i++)
        {
            if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+N])//利用二维数组直接判断是否和前面的皇后冲突
            {
                C[cur]=i+1;
                vis[0][i]=vis[1][cur+i]=vis[2][cur-i+N]=1;//修改全局变量
                search(cur+1);
                vis[0][i]=vis[1][cur+i]=vis[2][cur-i+N]=0;//出口处改回来!
            }
        }
}
 
 
int main()
{
    fin>>N;
    memset(C,0,14);
    search(0);
    fout<<tot<<endl;
    return 0;
}

 

posted @ 2013-08-16 22:13  cavehubiao  阅读(176)  评论(0编辑  收藏  举报