看板 ACMCLUB 關於我們 聯絡資訊
我解開但是怎麼更快呢,我是指用Backtracking, 我的作法是,如果把斜線分成偶數和奇數條,偶數不會撞到奇數, 再分開找出放k個棋子分別放在偶數條斜線和積數條斜線各有幾種方法, 接下來就用 k個棋子中放在偶數條斜線上的*(k-放在偶數條斜線上的)的總和, 就求出k個棋子放在棋盤上的解法,然後分別從其盤是2求到八, 棋盤大小是1的時候我是直接把答案放到結果table裡面, 這就是作法了......(希望能夠被理解), 目前覺得應該可以推出來,就是不用暴力找解, 但實在很好奇就是.....我的backtracking總是沒辦法到最快. 所以想請大家如果也是使用backtracking解出來的....看看有沒有什麼地方, 是很特別巧思.....可以給我參考參考 我把我的code貼在下方(如果不可以這樣可以跟我說一聲): #include <iostream> using std::cout; using std::cin; using std::endl; void initial(bool *slash,bool *backslash) { int i; for (i=0;i<15;i++) slash[i]=backslash[i]=0; } bool validity(bool *slash,bool *backslash,int x,int y) { return !(slash[x+y] || backslash[x-y+7]); } //n是棋子,n減到變成零的時候就是一個solution //x,y是啟起始位置 //solution stands for the number of solutions. //size means the size of checkboard. void backtracking(int x,int y,int n,int *solution,int size,bool *slash,bool *backslash) { if (!n) { (*solution)++; return; } int i,j; for (i=x,j=y;i<size;i++) { while (j<size) { if (validity(slash,backslash,i,j)) { slash[i+j]=backslash[i-j+7]=1; backtracking(i,j,n-1,solution,size,slash,backslash); slash[i+j]=backslash[i-j+7]=0; } j+=2; } if (j%2) j=0; else j=1; } } void answer(int table[][65]) { int i,j,k; int solution; bool slash[15],backslash[15]; int black[65],white[65];//黑白分開 int result; initial(slash,backslash); for (i=1;i<9;i++) table[i][0]=1; table[1][1]=1; for (i=2;i<9;i++)//the size of check board { black[0]=white[0]=1;//什麼都不放也算一種放法 for (j=1;j<i;j++)//j<i因為白色黑色部分最多只能放進去i-1個棋子(觀察得知) { if (i%2) { //black goes first solution=0; backtracking(0,0,j,&solution,i,slash,backslash); black[j]=solution; //the tern of white solution=0; backtracking(0,1,j,&solution,i,slash,backslash); white[j]=solution; } else { solution=0; backtracking(0,0,j,&solution,i,slash,backslash); black[j]=white[j]=solution; } } for (j=1;j<=2*(i-1);j++)//j是棋盤上總共要擺幾個棋子 { result=0; for (k=0;k<i;k++) if (j-k<i && j-k>=0) result+=black[k]*white[j-k]; table[i][j]=result; } } } main() { int table[9][65]={0}; int n,k; answer(table); while (cin>>n>>k && n || k) cout<<table[n][k]<<endl; return 0; } .............maybe too long to read...... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.161.17.206 ※ 編輯: kc655039 來自: 218.161.17.206 (08/31 00:58) ※ 編輯: kc655039 來自: 218.161.17.206 (08/31 01:00)