hdu3500 DFS

两个DFS()~~~

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char map[10][10];
int xx[4]={0,1,0,-1};
int yy[4]={1,0,-1,0};
struct node
{
    int x,y;
    int dir;
};
node res[10000];
void fling(int x,int y,int i)
{
    int nx=x+xx[i];
    int ny=y+yy[i];
    int flag=0;
    if(nx<0||nx>=7||ny<0||ny>=8)
    {
        map[x][y]='X';
        return ;
    }
    while(map[nx][ny]=='X')
    {
        nx=nx+xx[i];
        ny=ny+yy[i];
        if(nx<0||nx>=7||ny<0||ny>=8)
        {
            flag=1;
            break;
        }
    }
    if(flag)
    {
        map[x][y]='X';
        return ;
    }
    map[x][y]='X';
    map[nx-xx[i]][ny-yy[i]]='O';
    fling(nx,ny,i);

    return ;
}
int dfs(int sum,int k)
{
    if(sum==1)
    {
        return 1;
    }
    char t_map[10][10];
    memcpy(t_map,map,sizeof(map));
    int x,y;
    for(x=0;x<7;x++)
    {
        for(y=0;y<8;y++)
        {
            if(map[x][y]=='X')
                continue;
            int i;

            for(i=0;i<4;i++)
            {

                int nx=x+xx[i];
                int ny=y+yy[i];
                if(nx<0||nx>=7||ny<0||ny>=8)
                    continue;
                if(map[nx][ny]=='O')
                    continue;
                int flag=0;
                while(map[nx][ny]=='X')
                {
                    nx=nx+xx[i];
                    ny=ny+yy[i];
                    if(nx<0||nx>=7||ny<0||ny>=8)
                    {
                        flag=1;
                        break;
                    }
                }
                if(flag)
                    continue;
                map[x][y]='X';
                map[nx-xx[i]][ny-yy[i]]='O';

                fling(nx,ny,i);

                res[k].x=x;
                res[k].y=y;
                res[k].dir=i;

                if(dfs(sum-1,k+1))
                    return 1;

                memcpy(map,t_map,sizeof(t_map));
            }

        }
    }
    return 0;
}
int main()
{
    char temp[10];
    int cas=0;
    while(scanf("%s",temp)!=EOF)
    {
        cas++;
        int i,j;
        for(i=0;i<8;i++)
            map[0][i]=temp[i];
        for(i=1;i<7;i++)
            scanf("%s",map[i]);
        int sum=0;
        for(i=0;i<7;i++)
        {
            for(j=0;j<8;j++)
            {
                if(map[i][j]=='O')
                    sum++;
            }
        }
        memset(res,-1,sizeof(res));
        dfs(sum,0);
        if(cas!=1)
            printf("\n");
        printf("CASE #%d:\n",cas);
        for(i=0;res[i].dir!=-1;i++)
        {
            char c;
            if(res[i].dir==0)
                c='R';
            else if(res[i].dir==1)
                c='D';
            else if(res[i].dir==2)
                c='L';
            else if(res[i].dir==3)
                c='U';
            printf("%d %d %c\n",res[i].x,res[i].y,c);

        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值