奇偶剪枝

来源:互联网 发布:英雄联盟源码 编辑:程序博客网 时间:2024/05/21 09:35

经典小狗捡骨头

#include<bits/stdc++.h>using namespace std;char a[10][10];int sx,sy,ex,ey;int dir[4][2]={0,1,1,0,0,-1,-1,0};void dfs(int x,int y,int time);int book[10][10],n,m,flag,t;int main (){    while(1)    {        scanf("%d %d %d",&n,&m,&t);        getchar();        if(n==0||m==0)        break;        int i,j;                for(i=0;i<n;i++)        {        for(j=0;j<m;j++)        {            scanf("%c",&a[i][j]);            if(a[i][j]=='S')            {                sx=i;                sy=j;            }            if(a[i][j]=='D')            {                ex=i;                ey=j;            }        }        getchar();          }           flag=0;        memset(book,0,sizeof(book));        book[sx][sy]=1;        dfs(sx,sy,0);        if(flag==1)        printf("YES\n");        else        printf("NO\n");    }}void dfs(int x,int y,int time){    int tx,ty;    if(flag==1)    return;    if(x==ex&&y==ey)    {        if(time==t)        {           flag=1; return;        }    }    int i;    if(t-time<abs(ex-x)+abs(ey-y)||(t-time-abs(ex-x)-abs(ey-y))%2==1)        return;    for(i=0;i<4;i++)    {        tx=x+dir[i][0];        ty=y+dir[i][1];        if(tx<0||ty<0||tx>=n||ty>=m)        continue;        if(a[tx][ty]!='X'&&book[tx][ty]==0)        {            book[tx][ty]=1;        //  printf("%d %d %d\n",tx,ty,time);            dfs(tx,ty,time+1);            book[tx][ty]=0;        }    }}