-
1:递归实现组合型枚举
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
从 1∼n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。
- 输入
-
两个整数 n,m ,在同一行用空格隔开。n > 00 ≤ m ≤ nn+(n−m) ≤ 25
- 输出
-
按照从小到大的顺序输出所有方案,每行 1 个。首先,同一行内的数升序排列,相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。
- 样例输入
-
5 3
- 样例输出
-
1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5
1 #include<iostream> 2 #define Maxn 1000 3 using namespace std; 4 5 int cnt=0; 6 int n,m; 7 int num[Maxn]; 8 9 void rank(int x) 10 { 11 if(cnt==m){ 12 for(int i=1;i<=m;++i){ 13 cout<<num[i]<<' '; 14 } 15 cout<<endl; 16 } 17 for(int i=x;i<=n;++i) 18 { 19 num[++cnt]=i; 20 rank(i+1); 21 cnt--; 22 } 23 } 24 int main() 25 { 26 cin>>n>>m; 27 rank(1); 28 return 0; 29 }
2:马走日
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
马在中国象棋以日字形规则移动。
请编写一段程序,给定 n * m 大小的棋盘,以及马的初始位置 (x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。
- 输入
- 第一行为整数 T,表示测试数据组数。
每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标 n,m,x,y。
1 <= T <= 9
1 <= n, m <= 9
0 <= x <= n - 1
0 <= y <= m - 1 - 输出
- 每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,若无法遍历棋盘上的所有点则输出 0。
- 样例输入
-
1 5 4 0 0
- 样例输出
-
32
1 #include<iostream> 2 #include<cstring> 3 #define check(p,q) (p>=0&&q>=0&&p<X&&q<Y) 4 using namespace std; 5 6 typedef struct node{ 7 int x;//横坐标 8 int y;//纵坐标 9 }N; 10 int dir[8][2]={ 11 {-1, -2}, {-2, -1}, 12 {-2, 1}, {-1, 2}, 13 {1, 2}, {2, 1}, 14 {2, -1}, {1, -2} 15 }; 16 int Y,X,x0,y0,cnt; 17 int site[15][15]; 18 N firstSite; 19 void dfs(N nowSite,int k) 20 { 21 if(k>=Y*X){ 22 cnt++; 23 return ; 24 } 25 for(int i=0; i<8; ++i) 26 { 27 N s; 28 s.x=nowSite.x+dir[i][0]; 29 s.y=nowSite.y+dir[i][1]; 30 if(check(s.x,s.y)&&site[s.y][s.x]==0) 31 { 32 site[s.y][s.x]=1; 33 dfs(s,k+1); 34 site[s.y][s.x]=0; 35 } 36 } 37 } 38 int main() 39 { 40 int N,k; 41 cin>>N; 42 while(N--) 43 { 44 cnt=0; 45 k=1; 46 cin>>X>>Y>>firstSite.x>>firstSite.y; 47 site[firstSite.y][firstSite.x]=1; 48 dfs(firstSite,k); 49 cout<<cnt<<endl; 50 memset(site,0,sizeof(site)); 51 } 52 return 0; 53 }