今天是2018.5.24,loli给我们说要考搜索,本来以为是给初学者们考的就没准备,然而老师说我们也要考。
T1:N皇后问题
。。。这个没什么好说的,真的就是普通的N皇后问题,输出方案(n<=10),本来想用位运算保存行和斜线,但是怕在简单题上写炸于是就写了很朴素的做法。
# include <cstdio> # include <iostream> # include <cstring> using namespace std; int n,A=0; bool a[12]; bool b[30]; bool c[30]; int ans[12]; void write() { A++; for (int i=1;i<n;i++) printf("%d ",ans[i]); printf("%d\n",ans[n]); } void dfs(int x) { if(x==n+1) { write(); return ; } for (int i=1;i<=n;i++) { if(a[i]) continue; if(b[i+x]) continue; if(c[i-x+n]) continue; a[i]=true; b[i+x]=true; c[i-x+n]=true; ans[x]=i; dfs(x+1); a[i]=false; b[i+x]=false; c[i-x+n]=false; } } int main() { freopen("Queen.in","r",stdin); freopen("Queen.out","w",stdout); scanf("%d",&n); dfs(1); if(A==0) printf("no solute!\n"); fclose(stdin); fclose(stdout); return 0; }
T2:有重复元素的排列问题
和luogu上同名题目一模一样。然而考试时我问老师元素是不是只有'a'-'z', 他说不一定。。。那也好办,就按ascii码存一下,最大到300总够了吧,然而会很慢,于是。。。再记录一下最大最小值就OK啦,虽然还可以离散化一下,然而对于这道题不用。最气的是考完发了评测包发现数据中并没有任何奇怪的东西,就是只有'a'-'z'。