记录

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 }














天涯犹在,不诉薄凉。
原文地址:https://www.cnblogs.com/Knight02/p/14710350.html