Total Submission(s): 6950 Accepted Submission(s): 3150
10
这道题,不容易啊,一道递归题目,
它的方法就是,你递归传的是行号,建立一个数组,
数组下标表示第几行,数组内容表示皇后在第几列,
至于会不会在同一行或者同一列或者45°角问题,
同一行:每次递归 行号+1,所以不可能在同一行,
同一列:这就需要循环了,数组存了第几列,可以判断,一个循环足够
45°角:这个也是要循环,仔细研究发现 两个皇后 横坐标差的绝对值若等于纵坐标差的绝对值,那肯定不能同时存在
递归什么时候停止呢?
传的是行号,当行号大于n的时候,
比如要求3x3时候,若行号大于3,则停止,++total,
这就是解题方案,很简单吧,对了,这道题,不可能,你输入n然后现搜索,必须要打表
就是提前算出来,因为N小于等于10,用一个数组存答案,while输入一个N,输出相应数组下标的值
好了,这样AC即将来临!
O(∩_∩)O哈!
代码:
#include <iostream> #include <cmath> using namespace std; // sl存的是种数,即答案。 row存的是,下标行的列数, // 比如 row[1]=1 代表第一行第一列有一个皇后 int sl[11],row[11]; int total,m; void search(int hang) { if(hang>m) { ++total; return; } int x=hang,i,y; for(y=1;y<=m;++y) { for(i=1;i<x;++i) if(row[i]==y) break; if(i<x) continue; for(i=1;i<x;++i) if(abs(row[i]-y)==abs(x-i)) break; if(i<x) continue; row[x]=y; search(hang+1); } } int find() { total=0; search(1); return total; } int main() { // 要打表哟,否则TLE啦 for(m=1;m<=10;++m) sl[m]=find(); int n; while(cin>>n && n!=0) { cout<<sl[n]<<endl; } return 0; }
ACM-递归之n皇后——hdu2553,布布扣,bubuko.com
原文:http://blog.csdn.net/lttree/article/details/20796403