ZZULIOJ:1148: 组合三位数之一

题目描述

把1、2、3、4、5、6、7、8、9组合成3个3位数,要求每个数字仅使用一次,使每个3位数均为完全平方数。按从小到大的顺序输出这三个三位数。

输入

输出

按从小到大的顺序输出这三个三位数,由空格隔开。输出占一行。

源代码

//本题即为枚举类型,我使用的是dfs来解决,但是最初WA了一发
//是因为没读清题,本题的意思是用1-9这9位数来构造3个3位数
//且这三个三位数都是完全平方数,没有重复的数字,每个数字只能用一次
//还要按照从小到大的方式输出这三位数 
#include <iostream>
#include <cmath>
using namespace std;
const int N = 1000000 + 10;
//path数组存九位,每三位一位 
int path[N];
//布尔数组保证每个数只能用一次 
bool vis[N];
//flag标志保证仅仅输出一个解 
int flag = 0;
//对于判断完全平方数我采用数学库的方法来判断
//完全平方数的概念即为某个数的根是整数
//我们用数学库sqrt求得的正整数的根会向下取整
//因此若根是一个小数则必为错误根,其平方也不等于n 
bool judge(int n)
{
    int root = sqrt(n);
    if(root * root == n)return true;
    else return false;
}
//然后使用深度优先搜索来枚举这九个数 
void dfs(int u)
{
    if(u == 9)
    {
    	//依次为第一二三个三位数 
        int ans1 = path[0] * 100 + path[1] * 10 + path[2];
        int ans2 = path[3] * 100 + path[4] * 10 + path[5];
        int ans3 = path[6] * 100 + path[7] * 10 + path[8];
        //若三者都为完全平方数且flag为0 
        if(judge(ans1) && judge(ans2) && judge(ans3) && flag == 0)
        {
            flag = 1;//置flag为1,后续解不在输出 
            cout << ans1 << ' ' << ans2 << ' ' << ans3 << ' ';
        }
        return;//回溯 
    }
    for(int i = 1;i <= 9;i ++ )
    {
        if(!vis[i])
        {
            path[u] = i;
            vis[i] = true;
            dfs(u + 1);
            vis[i] = false;
        }
    }
}
int main()
{
	//我们枚举采用的是最靠前,最低为优先,因此能够保证答案是升序 
    dfs(0);
    return 0;   
}

猜你喜欢

转载自blog.csdn.net/couchpotatoshy/article/details/126077185