zoukankan      html  css  js  c++  java
  • 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
    ",count);  
        }  
        return 0;  
    }  
  • 相关阅读:
    大道至简 读后感01
    《人月神话》读后感
    水王继续
    软工大作业DB天气项目风险评估
    自我调查 使用输入法
    课堂练习之找“水王”
    浪潮之巅阅读笔记之三
    浪潮之巅阅读笔记之二
    浪潮之巅阅读笔记之一
    课程改进意见
  • 原文地址:https://www.cnblogs.com/zz990728/p/8900383.html
Copyright © 2011-2022 走看看