zoukankan      html  css  js  c++  java
  • HDU 2553 N皇后问题(深搜+回溯)

    http://acm.hdu.edu.cn/showproblem.php?pid=2553

    回溯法,一直错在了标记为1,0上面,应该标记为++,这样回溯的时候才不会把别人的点还原;

    同时,这一题要记录下来这10个的answer,否则TLE

    #include<stdio.h>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int t, k, n;
    char map[105][105] = {0};
    void dfs(int x, int y);
    int main()
    {
    
    	while (~scanf("%d", &n) && n!=0)
    	{
    		k = 0;
    		for(int i=1;i<=n;i++)
    		{
    			memset(map,0,sizeof(map));
    			dfs(1,i);
    		}
    		printf("%d
    ",k);
    	}
    }
    
    void dfs(int x, int y)
    {
    	int xx, yy,i ,j;
    	if(x==n)
    	{
    		k++;
    		return;
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=n;j++)
    		{
    			if(i==x || j==y || x+y==i+j || x-i==y-j)
    				map[i][j]++; //不能直接标记为0,用++能记录该点被用过多少次,否则下次回溯的时候,直接把重复的点他、也还原了
    		}
    	}
    	for(i=1;i<=n;i++)
    	{
    		if(map[x+1][i] == 0)
    		{
    			dfs(x+1,i);
    		}
    	}
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=n;j++)
    		{
    			if(i==x || j==y || x+y==i+j || x-i==y-j)
    				map[i][j]--;
    		}
    	}
    }
    



    www.cnblogs.com/tenlee
  • 相关阅读:
    第一周作业
    第一周作业
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业03
    C语言I博客作业04
    c语言|博客作业02
    字段的约束验证
    [转]AS IS ? ??运算符
    BindingManagerBase 跟踪不一致
  • 原文地址:https://www.cnblogs.com/tenlee/p/4420149.html
Copyright © 2011-2022 走看看