• hdoj2553N皇后问题


    N皇后问题

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 3860    Accepted Submission(s): 1801


    Problem Description
    在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
    你的任务是,对于给定的N,求出有多少种合法的放置方法。

     

    Input
    共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
     

    Output
    共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
     

    Sample Input
    1 8 5 0
     

    Sample Output
    1 92 10
    算法入门经典有讲=。=
    #include<cstdio>
    #include<cstring>
    int board[12];
    int sum[12]={0};
    bool used[3][20];
    int n,ans;
    void dfs(int cur)
    {
    	int i;
    	if(cur==n)
    		ans++;
    	else
    	{
    		for(i=0;i<n;i++)
    		{
    			if(!used[0][i]&&!used[1][cur+i]&&!used[2][cur-i+n])
    			{
    				board[cur]=i;
    				used[0][i]=used[1][cur+i]=used[2][cur-i+n]=1;
    				dfs(cur+1);
    				used[0][i]=used[1][cur+i]=used[2][cur-i+n]=0;
    			}
    		}
    	}
    }
    int main()
    {
    	while(scanf("%d",&n),n)
    	{
    		memset(used,0,sizeof(used));
    		ans=0;
    		if(sum[n]!=0)
    			printf("%d\n",sum[n]);
    		else
    		{
    			dfs(0);
    			printf("%d\n",ans);
    			sum[n]=ans;
    		}
    	}
    	return 0;
    }




  • 相关阅读:
    HDU 3833 YY's new problem ()
    从文件读入16进制数转化为10进制数再输出到文件中
    UESTC 1215 (思维题 旋转)
    HDU2067卡特兰数
    HDU2050离散数学折线分割平面
    cshell学习
    C++学习1
    QT学习1
    QT Creator常用快捷键
    Ubuntu14.04安装QT5.5
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5835302.html
Copyright © 2020-2023  润新知