LeetCode 996 正方形数组的数目


给定一个数组,将数组内数字重新排序,使得相邻的两个数字之和为完全平方数,求有多少种排列方法。如果两种方法每一位上的数字都相同,则视为一种。本题我的思路就是首先把每个数字看作节点,如果两个数字的和是完全平方数就可以连一条边,然后就可以开始回溯。在回溯的过程中,在当前状态下,如果选择的数字之前选择过,则不需要再选择,具体见代码。(第一次在力扣上写题解)

class Solution {
public:
    int vis[15],ans;//vis[i]表示第i个数字是否已经使用过
    int equ[13][13];//equ[i][j]=1表示第i个数和第j个数相等
    vector G[13];//记录图中各节点的连接
    //now表示当前选择第now个节点,x表示当前节点是原数组的第x个数,end是数组大小
    void dfs(int now,int x,int end)
    {
        //记录当前选择的数字在之前是否使用过,如果使用过就可视为相同的情况,直接跳过。
        int trys[12]={0};
        //当前的数组顺序符合条件,答案加一
        if(now==end-1) 
        {
            ans++;
            return ;
        }
        //每次选择一个节点去进行回溯,第一个节点的选择没有限制
        if(now==-1){
            for(int i=0;i& A) {
        int sz=A.size();
        int sum,t;
        for(int i=0;i