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;
}