POJ1753 + POJ2965 翻牌问题 DFS方法(枚举)

之前写过非DFS方法,附上链接:https://blog.csdn.net/Cc_Sonia/article/details/89432031

今天再回过头用DFS方法,,发现,,好暴力啊。。。就是一个个枚举,看翻还是不翻。。这两道题用DFS就基本没什么区别了,主要是第二道要记录路径。附上两题的AC代码如下:(果然时间慢了好多好多。。)

POJ1753:

#include
#include
#include
#include
using namespace std;
const int INF=0x3f3f3f3f;

char s[7][7];
int n,ans;
void change(int x,int y)
{
    if(s[x][y]=='b') s[x][y]='w';
    else s[x][y]='b';
}
void flip(int x,int y)
{
    change(x,y);
    if(x>0) change(x-1,y);
    if(y>0) change(x,y-1);
    if(x=n||y>=n)//注意!
        return;
    //"下一个"棋子
    int yy=(y+1)%n;
    int xx=x+(y+1)/n;
    dfs(xx,yy,num);//本身没有翻转
    flip(x,y);//注意是x,y!不是xx,yy!
    dfs(xx,yy,num+1);
    flip(x,y);//再翻回来,相当于没变
}
int main()
{
    n=4;
    for(int i=0;i

POJ2965:

#include
#include
#include
#include
using namespace std;
const int INF=0x3f3f3f3f;
#define mkp make_pair
typedef pair pp;

char s[7][7];
int n,ans;
pp aans[20],tmp[20];
void change(int x,int y)
{
    if(s[x][y]=='+') s[x][y]='-';
    else s[x][y]='+';
}
void flip(int x,int y)
{
    change(x,y);
    for(int i=0;i=n||y>=n)//注意!
        return;
    int yy=(y+1)%n;
    int xx=x+(y+1)/n;
    dfs(xx,yy,num);
    flip(x,y);
    tmp[num].first=x,tmp[num].second=y;//记录路径
    dfs(xx,yy,num+1);
    flip(x,y);
}
int main()
{
    n=4;
    for(int i=0;i

 

你可能感兴趣的:(算法-DFS/BFS)