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;}} 


原创粉丝点击