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灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP