【递推】【入门】位数问题

【递推】【入门】位数问题

在所有的N位数中,有多少个数中有偶数个数字3(说明,0是偶数)?
【输入格式】 读入一个数N
【输出格式】 输出有多少个数中有偶数个数字3。
【输入样例】 2
【输出样例】 73(由于 位数 比较大的情况下,导致输出数据可能越界,因此,输出个数 % 12345 的结果)
【数据规模】 1<=N<=1000

暴力统计

int main()
{
	int sum=0;
	int n;
	cin>>n;
	if(n==1) 
	{
		cout<<9<<endl;
		return 0;
	}
	for(int i=pow(10,n-1);i<pow(10,n);i++){
		int cnt =0; //统计有i中有几个3 
		int t=i;
		while(t){
			if(t%10==3){
				cnt++;
			}
			t=t/10;
		}
		// 如果3的个数是2的倍数,就满足条件. 
		if(cnt%2==0){
			sum++;
			sum%=12345; 
		}
	}
	cout<<sum<<endl;
	return 0;
}

递推


//列举、地推 

//c 
//c中奇数个3    只有1个3:3 
//c中偶数个3    含有0个3的有9个:0,1,2,4,5,6,7,8,9, 
//c[1][0] = 9  c[i][j]   i前i位,j有0,1两个状态,0存前i位含偶数个3的数量,1存前i位含奇数个3的数量。 
//c[1][1] = 1 
//如果i不是最高位 那么i范围是0~9有10位数,是最高位只能1~9有9位数。

//bc,有以下两种情况  
//c中奇数个3 那么 b中 应该选取 奇数个3     奇+奇=偶 
//c中偶数数个3 那么 b中 应该选取 偶数个3   偶+偶=偶 
// bc[2][0] =c[1][1] +c[1][0]*8     其中b为最高位时,1~9,不是3的只有8个 
// bc[2][1] =c[1][1]*8+c[1][0] 		其中b为最高位时,1~9,不是3的只有8个 

// abc
//要保证abc有偶数个三,有以下两种情况 
//bc中奇数个3 那么 a中 应该选取 3     奇+奇=偶 
//bc中偶数数个3 那么 a中 应该选取 偶数个3   偶+偶=偶 
//而要继续推abc,则之前的bc中b相对a,就不再是最高位,那么之前的b应该有0~9,所以8改9
//bc[2][0] =c[1][1] +c[1][0]*9
//bc[2][1] =c[1][1]*9+c[1][0]
//abc[3][0] = bc[1][1] +bc[1][0]*8 当前 a是最高位,范围1~9选取8 
//abc[3][1] = bc[1][1]*8 +bc[1][0] 

// abc 、bc、c,统称f
 
#include<iostream>
using namespace std;
int main(){
	int f[1001][2];
	int n,x;
	cin>>n;
	f[1][1]=1;
	f[1][0]=9;
	for(int i=2;i<=n;i++){
		x=9;
		if(i==n)
			x--;
		f[i][0]=f[i-1][1]+f[i-1][0]*x;
		f[i][1]=f[i-1][1]*x+f[i-1][0];
	}
	cout<<f[n][0]%12345;
	return 0;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
递推算法也可以用来解决n皇后问题,其基本思路是:从第一行开始,依次确定每一行的皇后位置,对于第i行,枚举该行的每一列,如果该列没有被之前的皇后占据,并且该列上下左右的对角线上也没有皇后,就将该列标记为已占据,并将该行的皇后位置记录下来;如果没有找到可用的列,就回溯到上一行重新选择位置。当找到一组可行的解时,将其记录下来,并回溯到上一行重新选择位置,直到找到所有的解。 具体实现时,可以使用三个数组分别记录列、对角线和反对角线是否被占用,初始状态都为false。对于每一行,枚举每一列,判断是否可以放置皇后,如果可以,就将该列和对角线、反对角线标记为已占据,并将该行记录下来;如果不能放置皇后,就继续枚举下一列。当所有列都尝试完毕,仍然没有找到可用的列,就回溯到上一行重新选择位置。当找到一组可行的解时,将其记录下来,然后回溯到上一行重新选择位置。 下面是n皇后问题C++代码实现,供您参考: ```c++ #include <iostream> #include <vector> using namespace std; vector<vector<int>> solveNQueens(int n) { vector<vector<int>> res; vector<int> board(n, -1); vector<bool> col(n, false); vector<bool> diag1(2*n-1, false); vector<bool> diag2(2*n-1, false); int row = 0, col_idx = 0; while (row >= 0) { if (col_idx == n) { // 回溯到上一行 row--; if (row >= 0) { col_idx = board[row] + 1; col[board[row]] = false; diag1[row+board[row]] = false; diag2[row-board[row]+n-1] = false; } } else if (!col[col_idx] && !diag1[row+col_idx] && !diag2[row-col_idx+n-1]) { // 判断是否冲突 board[row] = col_idx; col[col_idx] = true; diag1[row+col_idx] = true; diag2[row-col_idx+n-1] = true; if (row == n-1) { // 找到一个解,记录下来 res.push_back(board); col[board[row]] = false; diag1[row+board[row]] = false; diag2[row-board[row]+n-1] = false; col_idx = board[row] + 1; row--; } else { row++; col_idx = 0; } } else { // 继续尝试下一列 col_idx++; } } return res; } int main() { int n = 4; vector<vector<int>> res = solveNQueens(n); for (auto& sol : res) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (sol[i] == j) cout << "Q"; else cout << "."; } cout << endl; } cout << endl; } return 0; } ``` 希望这个代码能够帮助您理解递推算法解决n皇后问题的思路。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青衫未改

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值