Leetcode N-Queens II

1874 단어 LeetCodeIIN-Queens

N-Queens II

 
Total Accepted: 4450 
Total Submissions: 14913 My Submissions
Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
역귀회소법의 유연한 운용.
새로운 사고방식:
이곳의 최적화점은 밑에서 위로 누적하여 합치면 속도가 매우 빠르지만 이 문제는 밑에서 위로 합치면 여전히 어렵다.
4 ~ 5성급 난이도죠.
원래 12개의queens 테스트를 할 때 1000ms가 많은 것 같았는데, 지금은 9개의 용례만 있으면 간단하다.
int totalNQueens(int n) 
    {
        vector<int> q(n,-1);
	   return queens(q, n);
    }
    int queens(vector<int> &q, int n, int r = 0)
    {
	    if (r == n) return 1;
	    int sum = 0;
	    for (int i = 0; i < n; i++)
	    {
		    if (isLegal(q, r, i))
		    {
			    q[r] = i;
			    sum += queens(q, n, r+1);//q[r] = -1;
		    }
	    }
	    return sum;
    }
    bool isLegal(vector<int> &q, int r, int c)
    {
	    for (int i = 0; i < r; i++)
		    if (q[i] == c || q[i]-i == c-r || q[i]+i == c+r) return false;
	    return true;
    }

Leetcode의 슈퍼비트 연산 프로그램은 무슨 뜻인지 대충 알겠지만 너무 최고예요. 익숙하지 않으면 면접에서 이런 프로그램을 쓸 수 없을 거예요.
그리고 이것은 아마도 연산의 대가가 이런 알고리즘을 만들어 낼 수 있을 것이다. 이 알고리즘을 본 사람들은 모두 놀랄 것이다.
운행 속도가 매우 빠르다. 원래leetcode에서 12queens가 겨우 80ms 정도였다.그러나 현재 leetcode에서 난이도를 낮추었기 때문에 9개의queens의 용례만 있으면 이 슈퍼 알고리즘의 장점을 나타낼 수 없다.
class Solution {
public:
    int cnt,upper;
	int totalNQueens(int n) 
	{
		cnt = 0;
		upper = (1<<n)-1 ;
		Queen(0,0,0);
		return cnt;

	}
	void Queen(int row,int ld,int rd)
	{
		int pos,p;
		if(row!=upper)
		{
			pos = upper & (~(row | ld |rd));
			while(pos!=0)
			{
				p = pos & (-pos);
				pos = pos - p;
				Queen(row+p,(ld+p)<<1,(rd+p)>>1);
			}
		}
		else ++cnt;
	}
};

좋은 웹페이지 즐겨찾기