• [USACO1.5]八皇后 Checker Challenge


    东临碣石,以观沧海。
    水何澹澹,山岛竦峙。
    树木丛生,百草丰茂。
    秋风萧瑟,洪波涌起。
    日月之行,若出其中。
    星汉灿烂,若出其里。
    幸甚至哉,歌以咏志。——曹操

    题目:八皇后 Checker Challenge

    网址:https://www.luogu.com.cn/problem/P1219

    题目描述

    一个如下的6×6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

    image

    上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下:

    行号 1 2 3 4 5 6

    列号 2 4 6 1 3 5

    这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。
    并把它们以上面的序列方法输出,解按字典顺序排列。
    请输出前3个解。最后一行是解的总个数。

    输入格式

    一行一个正整数n,表示棋盘是n×n大小的。

    输出格式

    前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

    输入输出样例
    输入
    6
    
    输出
    2 4 6 1 3 5
    3 6 2 5 1 4
    4 1 5 2 6 3
    4
    
    说明/提示

    【数据范围】
    对于 100% 的数据,6≤n≤13。

    USACO Training Section 1.5

    搜索入门题。

    只考虑前面对后面产生的影响,不考虑后面对前面的影响(等效性)。分别记录每一列、左上角、右上角的占用情况,枚举时特判即可。

    代码如下:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define maxn 50 + 6
    using namespace std;
    bool vis[maxn][3];//记录标记情况 
    int n, cnt = 0, a[maxn];
    void dfs(int cur)
    {
    	if(cur == n + 1)
    	{
    		if(++ cnt > 3) return;
    		else
    		{
    			for(int i = 1; i <= n; ++ i)printf("%d ", a[i]);
    			puts("");
    			return;
    		}
    	}
    	for(int i = 1; i <= n; ++ i)
    	{
    		if(vis[i][0] == false && vis[i + cur - 1][1] == false && vis[i - cur + n + 1][2] == false)
    		{
    			vis[i][0] = vis[i + cur - 1][1] = vis[i - cur + n + 1][2] = true;
    			a[cur] = i;
    			dfs(cur + 1);
    			vis[i][0] = vis[i + cur - 1][1] = vis[i - cur + n + 1][2] = false;
    			a[cur] = 0;
    		}
    	}
    	return;
    }
    int main()
    {
    	memset(vis, false, sizeof(vis)); 
    	scanf("%d", &n);
    	for(int i = 1; i <= n; ++ i) a[i] = 0;//初始化 
    	dfs(1);
    	printf("%d
    ", cnt);
    	return 0;
    }
    
  • 相关阅读:
    【Nowcoder71E】组一组(差分约束,最短路)
    【CodeChef】Querying on a Grid(分治,最短路)
    【BZOJ4061】[Cerc2012]Farm and factory(最短路,构造)
    【AtCoder3611】Tree MST(点分治,最小生成树)
    【AtCoder2134】ZigZag MST(最小生成树)
    【CF891C】Envy(最小生成树)
    【BZOJ5339】[TJOI2018]教科书般的亵渎(斯特林数)
    【BZOJ5337】[TJOI2018]str(动态规划,哈希)
    【BZOJ5336】[TJOI2018]party(动态规划)
    【BZOJ5335】[TJOI2018]智力竞赛(二分图匹配)
  • 原文地址:https://www.cnblogs.com/zach20040914/p/12843691.html
Copyright © 2020-2023  润新知