zoukankan      html  css  js  c++  java
  • poj1272 棋盘问题 ——DFS入门题

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

    题目大意:

      中文题,省了……

    题目思路:

      感觉搜索题目还是要多做,很多东西都是开始看起来很复杂,其实根本就没有那么复杂,比如说这道,实际上就比较基础,可是,自己还是做不出来……o(╯□╰)o

      这道题目需要注意的一点就是:先DFS一行,然后要注意,要考虑当前行不放,直接DFS下一行!这个情况赶脚还是比较不容易想到的,虽然做完之后感觉也挺自然啊,可是……当初为毛想不到。。。就是思维的问题吧……代码看的是这位仁兄的:http://fuliang.iteye.com/blog/398700THX……^_^

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cctype>
     6 #include <stack>
     7 #include <queue>
     8 #include <deque>
     9 #include <map>
    10 #include <set>
    11 #include <vector>
    12 #include <cmath>
    13 #include <algorithm>
    14 #define lson l, m, rt<<1
    15 #define rson m+1, r, rt<<1|1
    16 using namespace std;
    17 typedef long long int LL;
    18 const int MAXN =  0x7fffffff;
    19 const int  MINN =  -0x7fffffff;
    20 const double eps = 1e-9;
    21 const int dir[8][2] = {{0,1},{1,0},{0,-1},{-1,0},{-1,1},
    22   {1,1},{1,-1},{-1,-1}};
    23 const int MAX = 10;
    24 char m[MAX][MAX];int cnt, n, k, sum;
    25 bool p[MAX];
    26 bool judge(int i, int j) {
    27   if (p[j] == false && m[i][j] == '#') return true;
    28   else return false;
    29 }
    30 void dfs(int x) {
    31   if (sum == k) {cnt++; return;}
    32   if (x >= n) return;
    33   int i;
    34   for (i = 0; i < n; ++i) {
    35     if (judge(x, i)) {
    36       p[i] = true; sum++; dfs(x+1);
    37       p[i] = false; sum--;
    38     }
    39   }
    40   dfs(x + 1);
    41 }
    42 int main(void){
    43 #ifndef ONLINE_JUDGE
    44   freopen("poj1321.in", "r", stdin);
    45 #endif
    46   while (~scanf("%d%d", &n, &k)) {
    47     int i, j;
    48     if (k == -1 && n == -1) break;
    49     //getchar();
    50     for (i  = 0; i <n ; ++i) {
    51       for (j = 0; j < n; ++j) {
    52         //scanf("%c", &m[i][j]);
    53         cin>>m[i][j];
    54       }
    55       //getchar();
    56     }
    57     cnt = 0;
    58     memset(p, false, sizeof(p));
    59     sum = 0;
    60     dfs(0);
    61     printf("%d\n", cnt);
    62   }
    63 
    64   return 0;
    65 }

    还有一个地方不懂……就是注释的那三行,如果把那三行的注释符号去掉,再把cin那一行删掉,也是可以过的。

    就是不明白为什么用scanf()读入一行一行的字符串也需要用getchar()?当初纠结好久……原来连读入都没有处理好……

    还有就是,这题过了以后,为了测试一下加getchar()是不是也可以过,然后就是各种WA啊……就不明白了,为什么刚才还可以过的代码,现在就WA了……好吧……后来才发现因为开了许多窗口,交错题了o(╯□╰)o多么奇葩的错误……

  • 相关阅读:
    [C#网络编程系列]专题一:网络协议简介
    也谈校园应用微同济的用户体验
    iOS 富文本类库RTLabel
    遥控三通直升机飞行原理简介
    A Distributed Algorithm Exercise
    在Ubantu 下下载代码 android源码 2
    新手模拟器训练指南(固定翼版)
    datasnap 2010 利用心跳包清除TCP死连接
    datasnap 2011 连接池
    datasnap 2010 利用JSON序列化和反序列化任何类型的对象
  • 原文地址:https://www.cnblogs.com/liuxueyang/p/3074971.html
Copyright © 2011-2022 走看看