poj 1321
来源:互联网 发布:手机登陆电脑版淘宝 编辑:程序博客网 时间:2024/06/10 06:29
一道简单的题, WR了好多次,……
这是我的第一个版本:
#include<iostream>#include<cstring>using namespace std;char map[9][9];int row[9], num;//row[i]=j;表示第j列第i行已放过棋子bool check(int n, int c){for(int i=0; i<c; i++)if(row[i]==row[c])return 0;return 1;}void DFS(int n, int k, int c){if(k==0) {num++;return;}if(n-c<k) return;////当剩余的棋子多余剩余的列时 for(int i=0; i<n; i++)//第c列放棋子时 {if(map[i][c]=='#'){row[c]=i;if( check(n, c)) DFS(n, k-1, c+1); row[c]=-1;//回溯}}DFS(n, k, c+1);//在第c列不放棋子子时}int main(){int n, k;while( cin>>n>>k && n!=-1){num=0;//开始时,我将row都初始化为0,结果WR,我一直找不到错//后来我又一想,当第0列第i行放过棋子后,row[i]=0;//然后,问题就出现了:在调用check()函数时,因为其他的row也都为0所以,在这时check()返回0;memset(row, -1, sizeof(row));for(int i=0; i<n; i++ )cin>>map[i];DFS(n, k, 0);cout<<num<<endl;}}
参考了网上的代码,修改后的:
#include<iostream>#include<cstring>using namespace std;char map[9][9];int vis_row[9], num;void DFS(int n, int k, int c){if(k==0) {num++;return;}if(n-c<k) return;//当剩余的棋子多余剩余的列时 for(int i=0; i<n; i++)//第c列放时 {if(map[i][c]=='#' && vis_row[i]==-1){vis_row[i]=c; DFS(n, k-1, c+1); vis_row[i]=-1;}}DFS(n, k, c+1);//在第c列不放棋子时}int main(){int n, k;while( cin>>n>>k && n!=-1){num=0;memset(vis_row, -1, sizeof(vis_row));//同样不能赋值为0 for(int i=0; i<n; i++) cin>>map[i]; DFS(n, k, 0); cout<<num<<endl;}}
- poj 1321
- poj 1321
- poj 1321
- poj 1321
- poj-1321
- poj 1321
- poj 1321
- poj 1321
- poj 1321
- poj 1321
- poj 1321
- POJ 1321
- POJ 1321
- poj --1321
- poj 1321
- poj-1321
- poj 1321
- POJ 1321
- 最长上升子序列 LIS(Longest Increasing Subsequence)
- 把人民币转化成大写
- Java时间日期格式转换
- c++虚继承对象的内存布局
- C++ 虚函数表解析
- poj 1321
- C++ 对象的内存布局(上)
- 从dos下 导入sql文件
- hdu 2561 第二小整数 (优先队列)
- #include time.h和 #include sys/time.h的区别
- 如何构建高性能网站(一):简介
- 系统托盘消息
- 获取IP地址
- wpf中datagrid的双击事件