zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    zoj 3627#模拟#枚举
    Codeforces 432D Prefixes and Suffixes kmp
    hdu 4778 Gems Fight! 状压dp
    CodeForces 379D 暴力 枚举
    HDU 4022 stl multiset
    手动转一下田神的2048
    【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律
    poj 3254 状压dp
    C++中运算符的优先级
    内存中的数据对齐
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3263603.html
Copyright © 2011-2022 走看看