您的位置:首页 > 其它

为什么一个垃圾深搜会搞了我一两天。。。。POJ-1321-棋盘问题

2016-03-01 17:33 399 查看
原因是:边界处理我总是弄不对。。。。
#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int maxn = 18;int vis[maxn];int s[maxn][maxn];int ans, N, K;void dfs(int cur, int chess) {if(cur > N+1) return ;if(chess == K+1) {ans++; return ;}for(int i = 1; i <= s[cur][0]; i++) {int tc = s[cur][i];if(!vis[tc]) {vis[tc] = 1;dfs(cur+1, chess+1);vis[tc] = 0;}}dfs(cur+1, chess);}int main() {while(cin >> N >> K && (N != -1 || K!= -1)) {memset(vis, 0, sizeof(vis));memset(s, 0, sizeof(s));ans = 0;for(int i = 1; i <= N; i++) {int cnt = 0;for(int j = 1; j <= N; j++){char ch;cin >> ch;if(ch == '#') s[i][++cnt] = j;}s[i][0] = cnt;}dfs(1, 1);cout << ans << endl;}return 0;}
这个是单纯的暴力枚举!!!!!!!!!!!!! 范围很小。。。。
#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int maxn = 18;int vis[maxn];int s[maxn][maxn];int ans, N, K;void dfs(int cur, int chess) {if(cur > N) return ;if(chess == K) {ans++; return ;}for(int i = 0; i < s[cur][0]; i++) {int tc = s[cur][i+1];if(!vis[tc]) {vis[tc] = 1;dfs(cur+1, chess+1);vis[tc] = 0;}}dfs(cur+1, chess);}int main() {while(cin >> N >> K && (N != -1 || K!= -1)) {memset(vis, 0, sizeof(vis));memset(s, 0, sizeof(s));ans = 0;for(int i = 0; i < N; i++) {int cnt = 0;for(int j = 0; j < N; j++){char ch;cin >> ch;if(ch == '#') s[i][++cnt] = j;}s[i][0] = cnt;}dfs(0, 0);cout << ans << endl;}return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: