POJ1321-回溯+DFS

来源:互联网 发布:php怎么找工作 编辑:程序博客网 时间:2024/06/05 00:29

https://vjudge.net/contest/165579#problem/A
开始的打算是搜出一个全排列,然后再除去k的全排列。
tle了。
于是乎打算记忆化搜索。出了一点小问题。那就是在搜索的时候,没有用xx+1,直接用的全排列和不回溯的条件。。
但是这种方法过不了两个棋子同时在同一行或一列内。还是必须用回溯搞。。。
又看了别人的代码。感觉别人的代码思路比较清晰,回溯的也挺好。
(在里在外回溯效果一样)

#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <queue>#include <stack>#include <string>const int maxn=2000;using namespace std;struct Node{   char a;   int x;   int y;}node[maxn];bool vis[maxn];bool vis2[maxn];int m,k;int n;int sum;int summ;void  dfs(int xx,int t){   if(t==k) { //cout<<xx<<"!!!"<<endl;    summ++;return ;}    //vis[node[xx].x]=true;   //vis2[node[xx].y]=true;    for(int i=xx+1;i<sum;i++)    {   if(!vis[node[i].x]&&!vis2[node[i].y])           { vis[node[i].x]=true;             vis2[node[i].y]=true;               dfs(i,t+1);            vis[node[i].x]=false;   vis2[node[i].y]=false;               }    }     //vis[node[xx].x]=false;   //vis2[node[xx].y]=false;    return ;}int main(){  char s;   //char a[maxn][maxn];    while(cin>>n>>k)    {  sum=1;    if(n==-1&&k==-1) break;        for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)        {  cin>>s;           if(s=='#')           { node[sum].a='#';           node[sum].x=i;           node[sum].y=j;           sum++;           }        }        memset(vis,false,sizeof(vis));        memset(vis2,false,sizeof(vis2));              summ=0;            dfs(0,0);            cout<<summ<<endl;    }    return 0;}
#include<iostream>#include<cstdio>#include<cstring>using namespace std;char a[10][10];     //记录棋盘位置int book[10];        //记录一列是否已经放过棋子int n,k;int total;    //total 是放棋子的方案数 ,m是已放入棋盘的棋子数目void dfs(int cs,int m){   if(m==k) {total++;return ;}     for(int i=0;i<n;i++)     {  if(a[cs][i]=='#'&&!book[i])         {  book[i]=true;             dfs(cs+1,m+1);              book[i]=false;//回溯         }     }   if(cs<=n-2) dfs(cs+1,m);}int main(){    int i,j;    while(scanf("%d%d",&n,&k)&&n!=-1&&k!=-1) //限制条件    {        total=0;        for(i=0; i<n; i++)            scanf("%s",&a[i]);        memset(book,0,sizeof(book));        dfs(0,0);        printf("%d\n",total);    }    return 0;}
原创粉丝点击