A - 棋盘问题(DFS搜索顺序)

A - 棋盘问题

 POJ - 1321 



TLE:

#include
#include
#include
using namespace std;
const int maxn=10;
char mmp[maxn][maxn];
int n,k,ans,sum;
vector >cnt;
bool column[maxn],row[maxn];
void dfs(int order)
{
    if(sum==k)
    {
        ans++;
        return ;
    }
    for(int i=order; i=(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>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< 
  

 

#include
#include
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>>k&&n!=-1&&k!=-1)
    {
        cnt=0;
        t=0;
        for(int i=0; i>maze[i][j];
        memset(vis,0,sizeof(vis));
        dfs(0);
        cout<=n)
		return ;
	for(int j=0;j 
 

你可能感兴趣的:(搜索进阶)