• 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;
    }
  • 相关阅读:
    老罗锤子手机发布会,我感到深深地愧疚!
    微价值:专访《甜心爱消除》的个人开发者Lee,日入千元
    [个人开发者赚钱二]从自己最熟悉的方面入手,获取小利
    [个人开发者赚钱一]改变思维,从心开始
    个人开发者赚钱一、改变思维,从心开始
    OC中的点语法,成员变量的作用域
    OC self super isa指针
    OC面向对象多态笔记
    OC面向对象继承关系和组合关系笔记
    OC面向对象封装
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3263603.html
Copyright © 2020-2023  润新知