牛客oj 习题9.3 八皇后(N皇后问题)&& 习题10.6 谁是你的潜在朋友(map)

N皇后模板题,顺便复习一下N皇后:

首先给出三个数组,列数组,主对角线数组,副对角线数组,代表行/对角线是否被占用。

因为每一行只能放一个元素,所以每遍历一次如果他可以放(即对应列和两个对角线上都没皇后)就标记一个,代表这个元素放置后他的列以及对角线都被占用,如此不断递归即得答案。

PS:这题输入样例又有问题,没有Case。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <climits>
 
using namespace std;
 
const int MAXN = 20;
const int INF = INT_MAX;

bool visit[3][MAXN];
vector<string> ans;

void dfs(int row, string path){
	if(row == 8){
		ans.push_back(path);
		return;
	}
	for(int i = 0; i < 8; i++){
		if(!visit[0][i - row + 8] && !visit[1][i] && !visit[2][i + row]){
			visit[0][i - row + 8] = visit[1][i] = visit[2][i + row] = true;
			char step = i + '1';
			dfs(row + 1, path + step);
			visit[0][i - row + 8] = visit[1][i] = visit[2][i + row] = false;
		}
	}
}

int main(){
    //freopen("in.txt", "r", stdin);
    int n;
    memset(visit, false, sizeof(visit));
    dfs(0, "");
	while(~scanf("%d", &n)){
		cout << ans[n-1] << endl;
	}
	return 0;
}

map的基本使用,不说了。。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
#include <climits>
 
using namespace std;
 
const int MAXN = 205;
const int INF = INT_MAX;

int main(){
//	freopen("in.txt", "r", stdin);
	int N, M, x;
	while(~scanf("%d %d", &N, &M)){
		map<int, int> mymap;
		int reader[MAXN];
		for(int i = 1; i <= N; i++){
			scanf("%d", &reader[i]);
			map<int, int>::iterator it = mymap.find(reader[i]);
			if(it == mymap.end()) mymap[reader[i]] = 0;
			else it->second++;
		};
		for(int i = 1; i <= N; i++){
			if(mymap[reader[i]] == 0) printf("BeiJu\n");
			else cout << mymap[reader[i]] << endl;
		}
	}
	return 0;
}
发布了411 篇原创文章 · 获赞 72 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/Flynn_curry/article/details/104948096