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这道题.(略)