Day41

今天终于拿到还算满意的offer了,马上又要去上班接受新挑战了
以后可能没有时间和耐力保证每天都记录一些东西了,但是这次决定一旦学了新的东西,遇到了新问题,一定要记一下,以免以后再找工作面试官问解决过什么问题依然大脑短路。
为了庆祝,今天再做一道题吧

已知一个整数N,可以组成一个从1到N包含N个数的数组,其中任意位置 i 满足1<= i <= N,如果满足以下条件:
数组中第i位上的数字可以被i整除
或i可以整除数组中第i位上的数字
则称这样的数组为Beautiful Arrangement,求N对应几组这样的数组。

思路:暴力的方法,从1开始依次试探,比如1,2,3,以1开头,下一位肯定不能是1,因为1被访问过了,下一位可以是2,然后设置2为已访问,下一位也不能是3,因为数字3和位置2不满足一方能被另一方整除的条件,然后以1,2为开头,接下来只能是3了,这样1,2,3满足条件,计数加一。接下来以相同的方法试探以2和3开头的情况。

public int count = 0;
public int BeautifulArrangement(int N)
{
    bool[] visited = new bool[N + 1];
    Caculate(N, visited, 1);
    return count;
}
public void Caculate(int N, bool[] visited, int p)
{
    if(p > N)
    {
        count++;          
    }
    for(int i = 1; i <= N; i++)
    {
        if(!visited[i] && (p % i == 0 || i % p == 0))
        {
            visited[i] = true;
            Caculate(N, visited, p+1);
            visited[i] = false;
        }
    }
}

你可能感兴趣的:(记忆,数组)