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);
}