题目链接:poj1321
中文题就不多解释题意了。
解题思路:注意平常的可以用点都用.表示, 结果这道题的可用点竟然是用#表示的。简单粗暴的DFS,注意标记量的备份即可轻松AC。
/********************************************************************* FileName: 1321.cpp Author: wing Created Time: 2014年07月30日 星期三 11时49分29秒 *********************************************************************/ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,k; char ss[10][10]; bool vx[10],vy[10]; int ans; void dfs(int x,int y,int cnt) { //cout<<" x="<<x<<" y="<<y<<" cnt="<<cnt<<endl; //cout<<" ans="<<ans<<endl; if(x==n)return; int xx,yy; xx=x; yy=y+1; if(yy>=n) { yy=0; xx++; } bool flag=false; if(ss[x][y]=='#'&&!vx[x]&&!vy[y]) { if(cnt==k-1) { ans++; flag=true; } if(!flag) { bool vvx=vx[x],vvy=vy[y]; vx[x]=true;vy[y]=true; //cout<<"fuck"<<endl; dfs(xx,yy,cnt+1); vx[x]=vvx;vy[y]=vvy; } } //cout<<"FFF"<<endl; dfs(xx,yy,cnt); } int main() { while(scanf("%d%d",&n,&k)) { ans=0; memset(vx,false,sizeof(vx)); memset(vy,false,sizeof(vy)); if(n==-1&&k==-1) break; for(int i=0;i<n;i++) { scanf("%s",ss[i]); } dfs(0,0,0); cout<<ans<<endl; } return 0; }