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;  
    }  
  • 相关阅读:
    1.border-image
    CSS3 3D transform
    js表单的focus()与blur()方法
    jquery背景backgroundPosition插件
    数字反转
    js的字符串charAt()方法
    FormData使用方法详解
    封装自己的jquery插件
    webpack打包vue项目之后怎么启动&注意事项
    JavaScript中的async/await
  • 原文地址:https://www.cnblogs.com/zz990728/p/8900383.html
Copyright © 2011-2022 走看看