HDU1010 && 多校联合第一场H题

HDU1010题目大意:狗狗在指定的时间不迟不早走到终点.

思路:奇偶剪枝+DFS

杭电这道题的输入有点坑,scanf+getchar()矩阵输入是不一定的.有可能是在一行输入.用了cin过的.o(╯□╰)o...

 

AC program:

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std; 
char map[10][10];
int  t[10][10];
int flag[10][10];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int n,m,s;
int starti,startj,endi,endj;
int dfs(int x,int y,int step)
{
    //cout<<"x <<y "<<x <<" "<<y<<endl;
    if(x==endi && y==endj &&step==0)
    {
        return 1;           
    }  
    if(t[x][y]-t[endi][endj]==0&&step%2!=0)//0->0或者1->1必须是偶数步
       {
         return 0;                                                               
       } 
    else if(t[x][y]-t[endi][endj]!=0&&step%2==0)
       {
         return 0;                                             
       }
    for(int i=0;i<4;i++)
    {
        int tx=x+dir[i][0];
        int ty=y+dir[i][1];
        if(tx>=0&&tx<n  &&ty>=0&& ty<m &&!flag[tx][ty]&&map[tx][ty]!='X')
        {
            flag[tx][ty]=1;
            if(dfs(tx,ty,step-1)==1)
                return 1;
            flag[tx][ty]=0;
                            
        }      
    }
   return 0; 
} 
int main()
{

while(~scanf("%d%d%d",&n,&m,&s)&&(m||n||s))
{
    
    for(int i=0;i<n;i++)
    {
       //getchar();
       for(int j=0;j<m;j++)
         {
             //scanf("%c",&map[i][j]);
             cin>>map[i][j]; 
             if(map[i][j]=='S')
                {
                  starti=i;
                  startj=j;               
                }    
             else if(map[i][j]=='D')
                {
                   endi=i;
                   endj=j;                    
                }
         }
    }
int f;
    for(int i=0;i<n;i++)
    {
       if(i%2==0)
          f=1;
       else
          f=0;
       for(int j=0;j<m;j++)
         {
            t[i][j]=f;
            f=1-f;     
         }        
    }
  /*  for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
          printf("%c ",map[i][j]);        
        }    
        printf("\n");
    }*/
    if(t[starti][startj]-t[endi][endj]==0&&s%2!=0)//0->0或者1->1必须是偶数步
       {
         printf("NO\n");
         continue;                                                                     
       } 
    else if(t[starti][startj]-t[endi][endj]!=0&&s%2==0)
       {
         printf("NO\n");
         continue;                                              
       } 
    memset(flag,0,sizeof(flag)); 
    flag[starti][startj]=1;   
    if(dfs(starti,startj,s)==1)
       printf("YES\n"); 
    else
       printf("NO\n");
                                     
}
//system("pause");
}


 

多校联合第一场H题

Problem H.跳格子
Time Limit: 1000ms Memory: 65536kb
Description
今天小云和小塘玩起了跳格子的游戏,小云对小塘说:
我在地上给你画一些格子,格子里面会出现下面的这些符号
‘S’ 表示你要从这个格子开始
‘X’ 表示这个格子不能跳
‘.’ 表示这个格子可以跳
‘D’ 表示跳到这个格子就结束了
然后我告诉你要跳的步数,每跳一格算一步,你能恰好跳到终点吗?

 

题目大意:同杭电1010这道题.(略)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值