A - 棋盘问题
POJ - 1321 TLE: #include<iostream> #include<vector> #include<cstring> using namespace std; const int maxn=10; char mmp[maxn][maxn]; int n,k,ans,sum; vector<pair<int,int > >cnt; bool column[maxn],row[maxn]; void dfs(int order) { if(sum==k) { ans++; return ; } for(int i=order; i<cnt.size(); i++) { if(!column[cnt[i].second]&&!row[cnt[i].first]) { sum++; column[cnt[i].second]=row[cnt[i].first]=1; if((cnt.size()-order)>=(k-sum)) dfs(order+1); sum--; column[cnt[i].second]=row[cnt[i].first]=0; } } } int main() { ios::sync_with_stdio(false); while(cin>>n>>k) { ans=sum=0; if(n==-1&&k==-1) break; for(int i=0; i<n; i++) for(int j=0; j<n; j++) { cin>>mmp[i][j]; if(mmp[i][j]=='#') cnt.push_back(make_pair(i,j)); } memset(column,0,sizeof(column)); memset(row,0,sizeof(row)); dfs(0); cout<<ans<<endl; } return 0; }
#include<iostream> #include<cstring> using namespace std; int n,k,cnt,t; int vis[8]; char maze[8][8]; void dfs(int x) { 注意这两个if,顺序不能颠倒,否则结果比实际满足要求的数量少1; 原因:程序执行到这里时,已经从上一层满足条件的情况跳到了下一层了, 所以此时的t是上一层满足条件的t的数量,而x是目前这一层的情况,还没有判断x是否越界和 判断是否可以放棋子,所以,这个t要优先判断是否满足了题意,然否再判断x是否越界; if(t==k) { cnt++; return ; } if(x>=n) return ; for(int j=0; j<n; j++) { if(maze[x][j]=='#'&&!vis[j]) { vis[j]=1; t++; dfs(x+1); vis[j]=0; t--; } } dfs(x+1);每一层都可以跳过不放。 } int main() { while(cin>>n>>k&&n!=-1&&k!=-1) { cnt=0; t=0; for(int i=0; i<n; i++) for(int j=0; j<n; j++) cin>>maze[i][j]; memset(vis,0,sizeof(vis)); dfs(0); cout<<cnt<<endl; } return 0; } dfs的另一种写法:每次传递两个参数; 注意把main()中的dfs改为dfs(0,0); void dfs(int x,int t) { if(t==k) { cnt++; return ; } if(x>=n) return ; for(int j=0;j<n;j++) { if(maze[x][j]=='#'&&!vis[j]) { vis[j]=1; dfs(x+1,++t);//注意t,一定要写成++t,t++和t+1都不对,因为我们的目的是让t在调用dfs之前就增加1,如果不这样写达不到目标效果; vis[j]=0; t--; } } dfs(x+1,t); }