POJ 1321 棋盘问题 dfs回溯
http://poj.org/problem?id=1321
题意:汉语的,so good。
和zoj1002差不多,递归,回溯
代码:
#include<iostream> #include<cstdio> #include<string> #include<cstring> using namespace std; int map[10][10]; int n,k; int ans; bool judge(int x,int y) { for(int i=x-1;i>=0;i--) { if(map[i][y]==2)return 0; } for(int i=y-1;i>=0;i--) { if(map[x][i]==2)return 0; } return 1; } void dfs(int u,int Sum) { if(u>n*n)return ; if(Sum==k) { ans++; return ; } int r=u/n; int c=u%n; if(map[r][c]==1&&judge(r,c)) { map[r][c]=2; dfs(u+1,Sum+1); map[r][c]=1; } dfs(u+1,Sum); } int main() { char ch; int i,j; while(~scanf("%d%d",&n,&k)) { if(n==-1&&k==-1) break; getchar(); memset(map,0,sizeof(map)); for(i=0;i<n;i++) for(j=0;j<n;j++) { cin>>ch; if(ch=='#')map[i][j]=1; } ans=0; dfs(0,0); printf("%d\n",ans); } return 0; }