poj1272 棋盘问题 ——DFS入门题

May 13, 2013
POJ DFS

题目链接:http://poj.org/problem?id=1321 题目大意:   中文题,省了…… 题目思路:   感觉搜索题目还是要多做,很多东西都是开始看起来很复杂,其实根本就没有那么复杂,比如说这道,实际上就比较基础,可是,自己还是做不出来……o(╯□╰)o   这道题目需要注意的一点就是:先DFS一行,然后要注意,要考虑当前行不放,直接DFS下一行!这个情况赶脚还是比较不容易想到的,虽然做完之后感觉也挺自然啊,可是……当初为毛想不到。。。就是思维的问题吧……代码看的是这位仁兄的:http://fuliang.iteye.com/blog/398700THX……^_^


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <algorithm>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std;
typedef long long int LL;
const int MAXN =  0x7fffffff;
const int  MINN =  -0x7fffffff;
const double eps = 1e-9;
const int dir[8][2] = {{0,1},{1,0},{0,-1},{-1,0},{-1,1},
  {1,1},{1,-1},{-1,-1}};
const int MAX = 10;
char m[MAX][MAX];int cnt, n, k, sum;
bool p[MAX];
bool judge(int i, int j) {
  if (p[j] == false && m[i][j] == '#') return true;
  else return false;
}
void dfs(int x) {
  if (sum == k) {cnt++; return;}
  if (x >= n) return;
  int i;
  for (i = 0; i < n; ++i) {
    if (judge(x, i)) {
      p[i] = true; sum++; dfs(x+1);
      p[i] = false; sum--;
    }
  }
  dfs(x + 1);
}
int main(void){
#ifndef ONLINE_JUDGE
  freopen("poj1321.in", "r", stdin);
#endif
  while (~scanf("%d%d", &n, &k)) {
    int i, j;
    if (k == -1 && n == -1) break;
    //getchar();
    for (i  = 0; i <n ; ++i) {
      for (j = 0; j < n; ++j) {
        //scanf("%c", &m[i][j]);
        cin>>m[i][j];
      }
      //getchar();
    }
    cnt = 0;
    memset(p, false, sizeof(p));
    sum = 0;
    dfs(0);
    printf("%d\n", cnt);
  }

  return 0;
}

还有一个地方不懂……就是注释的那三行,如果把那三行的注释符号去掉,再把cin那一行删掉,也是可以过的。 就是不明白为什么用scanf()读入一行一行的字符串也需要用getchar()?当初纠结好久……原来连读入都没有处理好…… 还有就是,这题过了以后,为了测试一下加getchar()是不是也可以过,然后就是各种WA啊……就不明白了,为什么刚才还可以过的代码,现在就WA了……好吧……后来才发现因为开了许多窗口,交错题了o(╯□╰)o多么奇葩的错误……

comments powered by Disqus