zoukankan      html  css  js  c++  java
  • 暴力求解法

    一.简单枚举

    第一题:除法
    #include <cstdio>
    #include <iostream>
    
    using namespace std;
    
    void dd(int n)
    {
    	
    	for (int i = 98765 / 79; i <= 98765 / 2; i++)//i是被除数
    	{
    		int y[12] = { 0 };
    		if (i < 10000)
    		{
    			y[0] = 1;
    
    		}
    		int k = i;//对当前数进行分解
    		int p;
    		bool isok = true;
    		do {
    			int temp = k % 10;
    			if (y[temp] == 1)
    			{
    				isok = false; break;
    			}
    			else {
    				y[temp] = 1;
    			}
    			k /= 10;
    		} while (k);
    		if (isok == false)
    		{
    			continue;
    		}
    		else
    		{
    			p = n * i;
    			int pp = p;
    			do {
    				int temp = pp % 10;
    				if (1 == y[temp]) {
    					isok = false; break;
    				}
    				else {
    					y[temp] = 1;
    				}
    				pp /= 10;
    			} while (pp);
    		}
    		if (isok)
    		{
    			if (i < 10000)
    			{
    				printf("%d/0%d=%d
    ", p, i, n);
    			}
    			else {
    				printf("%d/%d=%d
    ",p, i, n);
    			}
    		}
    	}
    }
    int main()
    {
    	int n;
    	cin >> n;
    	//scanf_s("%d", &n);
    	dd(n);
    	
    	return 0;
    }
    
    
    第二题:最大乘积
    int main() {
    	int n;
    	cin >> n;
    	int aa[20]; int i;
    	for (i = 0; i < n; i++)
    	{
    		cin >> aa[i];
    	}
    	long long max = aa[0] * aa[1];
    	for (int begin = 0; begin <=i- 1; begin++)
    	{
    		for (int end = begin + 1; end <=i; end++)
    		{
    			long long p = 1;
    			for (int j = begin; j <end; j++)
    			{
    				p *= aa[j];
    			}
    			if (p > max)
    			{
    				max = p;
    			}
    		}
    	}
    	if (max < 0)
    	{
    		cout << "0" << endl;
    	}
    	else {
    		cout << max << endl;
    	}
    	return 0;
    }
    
    
    第三题:分数拆分
    int main()
    {
    	int k;
    	cin >> k;
    	int ans = 0;
    	int y, x;
    	for (y = k + 1; y <= 2 * k; y++)
    	{
    		x = k*y / (y - k);
    		if (k * y %(y - k)==0)//保证是个整数
    		{
    			++ans; 
    			cout<<ans<<endl;
    			printf("1/%d=1/%d+1/%d
    ", k, x, y);
    		}
    	}
    	return 0;
    }
    
    

    二.枚举排列

    1.递归法生成排列

    #include<iostream>
    #include<cstdio>
    
    using namespace std;
    
    int ans=0;
    void meiju(int n, int* a, int cur)
    {
    	
    	if (cur == n)
    	{
    		for (int i = 0; i < n; i++)
    		{
    			
    			cout << a[i] << " ";
    		}++ans;
    		printf("
    ");
    	}
    	else
    	{
    		for (int i = 1; i <= n; i++)
    		{
    			int ok = 1;
    			for (int j = 0; j < cur; j++)
    			{
    				if (a[j] == i)ok = 0;
    			}
    			if (ok) {
    				a[cur] = i;
    				meiju(n, a, cur + 1);
    			}
    		}
    	}
    }
    int main()
    {
    	int n; cin >> n;
    	int a[20];
    	int cur=0;
    	meiju(n, a, cur);
    	cout << ans << endl;
    	return 0;
    }
    

    2.下一个排列,用stl中的库函数

    #include <algorithm>
    void jiedashu()
    {
    	int n;
    	cin >> n;
    	int aa[200];
    	for (int i = 0; i < n; i++)
    	{
    		cin >> aa[i];//3 2 1
    	}
    	sort(aa, aa + n);//1 2 3
    	do {
    		for (int j = 0; j < n; j++)//3
    		{
    			printf("%d ", aa[j]);
    		}
    		cout << "
    ";
    	} while (next_permutation(aa, aa + n));//求下一个排列
    }
    int main()
    {
    	jiedashu();
    	return 0;
    }
    

    三.枚举排列总结:

    枚举排列的常见方法有两种,一种是递归枚举,一种是STL中的next_permutation函数;

    四.回溯法

    1.定义:当把问题分成若干步骤求解时候,如果当前步骤没有合法选择,则将函数返回上一级调用。

    1.八皇后

    题目大意:8*8的网格,有八个皇后,他们不能处于同一行同一列和对角线上,问共有几种排列方法;

    //八皇后
    #include<cstdio>
    #include <iostream>
    
    using namespace std;
    int tot = 0; int n; int aa[100];
    void search(int cur)
    {
    	if (cur == n) tot++;
    	else for (int i = 0; i < n; i++){
    		
    		int ok = 1;
    		aa[cur] = i;//第cur行皇后放入第i列
    		for (int j = 0; j < cur; j++)//检查和前面的皇后是否冲突
    		{
    			if(aa[cur]==aa[j]||cur-aa[cur]==j-aa[j]||cur+aa[cur]==j+aa[j])//判断列,主对角线和副对角线
    			{
    				ok = 0; break;
    			}
    		}
    		if (ok)search(cur + 1);
    	}
    }
    
    int main()
    {
    	 cin >> n; 
    	 search(0); cout << tot << endl;
    
    }
    

    2.素数环

    题目:输入正整数n,把整数1,2,3....,n组成一个环,使得相邻的两个数之和均为素数,输出的时候从整数1开始逆时针排列,同一个环应恰好输出一次。n<=16。

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    
    using namespace std;
    int cur; int n; int aa[100]; bool book[20]; int ans = 1;
    
    bool isp(int x)
    {
    	if (x < 2)return false;
    	if (x ==2) return  true;
    	for (int i = 2; i <= sqrt(x); i++)
    	{
    		if (x % i == 0)return false;
    	}
    	return true;
    }
    void dfs(int x)
    {
    	if (x == n && isp(aa[0] + aa[n - 1]))
    	{
    		for (int i = 0; i < n - 1; i++)
    		{
    			cout<<aa[i]<<" ";
    		}
    		cout<<aa[n-1]<<endl;
    		return;
    	}
    	for (int i = 2; i <= n; i++)
    	{
    		if (!book[i] && isp(i + aa[x - 1]))
    		{
    			aa[x] = i;
    			book[i] = 1;
    			dfs(x + 1);
    			book[i] = 0;
    		}
    	}
    }
    int main()
    {
    	while (cin >> n)
    	{
    		if (ans > 1)cout << endl;
    		cout << "Case " << ans << ":" << endl; ans++;
    		book[1] = 1; aa[0] = 1;
    		dfs(1);
    		memset(book, false, sizeof(book));
    	}
    	return 0;
    }
    

    作者:Better又
    出处:https://www.cnblogs.com/lwyy1223-/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    logback配置模板
    mail
    jpa,querydsl
    加密签名
    angular2快速开始
    主从复制
    随笔
    缺货源的小伙伴们 我发现一个超级好的货源供应链 分享给大家
    canal+kafka+logstash+es 架构 logstash的配置
    golang 根据图片url获取图片尺寸
  • 原文地址:https://www.cnblogs.com/lwyy1223-/p/13558546.html
Copyright © 2011-2022 走看看