POj 1321 棋盘问题 DFS 回溯

#include<iostream>
#include<cstring>

using namespace std;

int m,k,ans;
char s[1010][1010];
int vis[1010][1010];

bool check(int x,int y)
{
    for(int i=0;i<m;i++)
        if((i!=x&&vis[i][y]==1)||(i!=y&&vis[x][i]==1))
        return false;
    return true;
}

void dfs(int x,int y,int v)
{
    if(x>=0&&x<m&&y<m&&y>=0&&vis[x][y]==0&&s[x][y]=='#'&&check(x,y))
    {
        vis[x][y]=1;
        if(v==k)ans++;
        for(int i=0;i<m;i++)
            for(int j=x+1;j<m;j++)
                if(s[j][i]=='#')
                    dfs(j,i,v+1);
        vis[x][y]=0;
    }
    return;
}

int main()
{

    while(cin>>m>>k&&m!=-1&&k!=-1)
    {
        ans=0;
        for(int i=0;i<m;i++)cin>>s[i];
        for(int i=0;i<m;i++)
            for(int j=0;j<m;j++)
            if(s[i][j]=='#')
            dfs(i,j,1);
        cout<<ans<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/HadesBlog/p/9630190.html