POJ 1321:棋盘问题
考试周后的第一发 写搜索题找手感
题意:给你一个n*n的棋盘及其放棋子的位置 给定旗子数目 问在满足条件下 能够有多少种不同放棋子的方法 写了一发DFS 差点写炸 不断搜索判断是否符合题意即可;
#include<algorithm> #include<queue> #include<vector> #include<map> #include<stack> #include<set> #include<iostream> #include<cstring> #include<cstdio> using namespace std; typedef struct node { int x; int y; } node; char a[100][100]; node b[100]; int first[1005]; int k; int sum=0; bool vis[100]; void dfs(int e,int t,int l) { int w; t++; if(t==1) { vis[e]=1; } if(t==k) { sum++; return ; } for(int i=e+1; i<=l; i++) { if(vis[i]==0) { int flag=0; w=e; while(first[w]!=-1) { if(b[i].x==b[w].x||b[i].y==b[w].y) { flag=1; break; } w=first[w]; } if(flag==0) { first[i]=e; dfs(i,t,l); } } } } int main() { int n; while(cin>>n>>k&&(n!=-1&&k!=-1)) { int p=0; memset(vis,0,sizeof(vis)); for(int i=1; i<=n; i++) { getchar(); for(int j=1; j<=n; j++) { scanf("%c",&a[i][j]); if(a[i][j]=='#') { p++; node t; t.x=i; t.y=j; b[p]=t; } } } b[0].x=0; b[0].y=0; sum=0; first[0]=-1; dfs(0,-1,p); cout<<sum<<endl; } return 0; }