标签:
1
#include<iostream> #include<cstring> #include<string> #include<cmath> #include<map> #include<queue> #include<cstdio> #include<vector> #include<algorithm> using namespace std; const int maxn=10; const int inf=210000; typedef long long ll; char tu[maxn][maxn]; int vis[maxn][maxn]; int ans; int n,k; void dfs(int x,int y,int num) { if(num==k) { ans++; return ; } int i,j; for(i=x;i<n;i++) for(j=(i==x?y:0);j<n;j++) { if(vis[i][j]==0&&tu[i][j]=='#') { for(int p=0;p<n;p++) { vis[i][p]++;//这里不能用vis[i][p]=true,因为这是整行整列的标记,交叉点,会受到影响,所以用数字标记, vis[p][j]++; } dfs(i,j,num+1); for(int p=0;p<n;p++) { vis[i][p]--; vis[p][j]--; } } } } int main() { int m,i,j,t; //#ifndef ONLINE_JUDGE // freopen("in.txt","r",stdin); // #endif // ONLINE_JUDGE while(~scanf("%d%d",&n,&k)) { if(n==-1&&k==-1)break; memset(tu,0,sizeof(tu)); for(i=0;i<n;i++) for(j=0;j<n;j++) cin>>tu[i][j]; ans=0; memset(vis,0,sizeof(vis)); dfs(0,0,0); printf("%d\n",ans); } return 0; }
标签:
原文地址:http://blog.csdn.net/u013167299/article/details/44276233