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; }