POJ 1321 棋盘问题 dfs

题目:http://poj.org/problem?id=1321

解法:一个比较经典的dfs问题,可以dfs每一行,保证每一行只放一颗棋子,然后标记相应的列即可。

AC:

#include<stdio.h>  
#include<string.h>  
int n,k;  
char map[10][10];  
int vis[10];  
int count;  
void Dfs(int index,int num)  
{  
    if(index>=n&&num!=0)return;         
    if(num>n-index)return;   //一个剪枝,即如果剩下的行数<剩下的棋子数,  
                             // 那这种方案肯定不行,就直接return结束  
    if(num==0){     //棋子按要求放完了,即又找到了一种方案  
        count++;  
        return;  
    }  
    int i;  
    for(i=0;i<n;i++){  
        if(map[index][i]=='.')continue;  
        if(vis[i])continue;  
        vis[i]=1;      //标记列  
        Dfs(index+1,num-1); //表示这一行要放棋子  
        vis[i]=0;  //回溯后,说明摆好棋子的状态已经记录,当前的列标记还原
    }  
    Dfs(index+1,num);    //表示这一行不放棋子  //当k<n时,index在等于n之前可能就已经全部摆好了,又因为全部棋子摆好后的某个棋盘状态已经在前面循环时记录了,因此为了处理多余行,令当前位置先不放棋子,搜索下一行放棋子的情况。
}  
int main()  
{  
    int i;  
    while(scanf("%d %d",&n,&k)!=EOF){  
        if(n==-1&&k==-1)break;  
        count=0;  
        for(i=0;i<n;i++){  
            scanf("%s",map[i]);  
        }  
        memset(vis,0,sizeof(vis));  
        Dfs(0,k);  //从第0行开始dfs
        printf("%d\n",count);  
    }  
    return 0;  
}  

 

posted @ 2018-04-21 11:43  Zoez  阅读(86)  评论(0编辑  收藏  举报