您的位置:首页 > 编程语言

USACO section2.4 The Tamworth Two题解&代码

2015-02-15 06:53 666 查看
很简单的模拟…需要避免产生循环的情况,所以设置vis数组记录step

但是需要注意的是使用scanf(“%c”,&m[i][j])的话scanf会等到遇到第一个非可读字符的时候结束…

这样的话j就不是准确的了…

恩…看了15min才看出来…果然是该去休息了…

/*
ID:rainbow16
LANG:C++
TASK:ttwo
*/
#include<stdio.h>
char m[10][10];
bool vis[10][10][4][10][10][4];
int cx,cy,cf,fx,fy,ff;
void dfs(int t)
{
if(cx==fx && cy==fy)
{
printf("%d\n",t);
return;
}
if(vis[cx][cy][cf][fx][fy][ff])
{
printf("0\n");
return;
}
vis[cx][cy][cf][fx][fy][ff]=1;
switch(cf)
{
case 0:
if(cx==0 || m[cx-1][cy]=='*')
cf++;
else
cx--;
break;
case 1:
if(cy==9 || m[cx][cy+1]=='*')
cf++;
else
cy++;
break;
case 2:
if(cx==9 || m[cx+1][cy]=='*')
cf++;
else
cx++;
break;
case 3:
if(cy==0 || m[cx][cy-1]=='*')
cf=0;
else
cy--;
break;
}
switch(ff)
{
case 0:
if(fx==0 || m[fx-1][fy]=='*')
ff++;
else
fx--;
break;
case 1:
if(fy==9 || m[fx][fy+1]=='*')
ff++;
else
fy++;
break;
case 2:
if(fx==9 || m[fx+1][fy]=='*')
ff++;
else
fx++;
break;
case 3:
if(fy==0 || m[fx][fy-1]=='*')
ff=0;
else
fy--;
break;
}
dfs(t+1);
}
int main(void)
{
freopen("ttwo.in","r",stdin);
freopen("ttwo.out","w",stdout);
for(int i=0;i<10;i++)
{
scanf("%s",&m[i]);
for(int j=0;j<10;j++)
{
if(m[i][j]=='C')
{
cx=i;
cy=j;
cf=0;
m[i][j]='.';
}
if(m[i][j]=='F')
{
fx=i;
fy=j;
ff=0;
m[i][j]='.';
}
}
}
dfs(0);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: