题目链接:http://poj.org/problem?id=1321
参考:http://www.cnblogs.com/xinxiangqing/p/4692994.html
简单搜索这个题加上 非常可乐的简单bfs大概拖了两个月了吧。主要还是自己太懒了,懒得思考,觉得一点点难就会很怂很怂。
贴代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;char board[8][8];
int judge[8];
int sum;
int n,k;
int main(int argc, char const *argv[])
{int dfs(int line,int step);while(cin>>n>>k){sum=0;memset(judge,1,sizeof(judge));if(n==-1&&k==-1)break;for(int i=0;i<n;i++){cin>>board[i];}dfs(0,0);cout<<sum<<endl;}
}int dfs(int line,int step){if(step==k){sum++;return 0;}for(int j=line;j<n;j++)for(int i=0;i<n;i++){if(board[j][i]=='#'&& judge[i]){judge[i]=0;dfs(j+1,step+1);judge[i]=1;}}
}
dfs 经典三段式,感觉讲的特别好。大概就是看了这个之后才找到了思路?
里面还有bfs的一些。
参考:http://blog.csdn.net/fightforyourdream/article/details/12866861
void dfs(int 当前状态) { if(当前状态为边界状态) { 记录或输出 return; } for(i=0;i<n;i++) //横向遍历解答树所有子节点 { //扩展出一个子状态。 修改了全局变量 if(子状态满足约束条件) { dfs(子状态) } 恢复全局变量//回溯部分 } }