ACMCLUB 板


LINE

我解開但是怎麼更快呢,我是指用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)







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP