做一名聪明的CS玩家

作为计算机学院的学生,CS应该是大家都很熟悉的一款游戏。那么如果你是一个真正的CS玩家,不如来试下这道题目吧。 当你在CSing的时候,什么事情最让你郁闷呢,估计就是当你与敌人刚要开战的时候,发现自己没有子弹了吧^_^。这个时候最聪明的选择就是赶快回到老家去买子弹继续战斗。那么怎样回到老家需要的时间最短呢??
Input输入的第一行有两个整数N,M分别表示的是地图的宽和长(1 =< M =< N <= 100),接下来的N行分别输入CS地图的具体情况。‘@’表示的是你现在所在的位置,‘#’表示的你老家的位置,‘X’表示的是敌人可能出现的位置,虽然是可能出现的位置,但是没有子弹的你显然不愿意冒险走这个位置,即使要节省时间。 ‘*’表示的是你可以放心走过的安全位置。
Output求出在保证安全的条件下从‘@’到老家‘#’所需要的最小时间并且输出,假设每走一步需要一个单位的时间,且你只能向上下左右四个方向走,并且不能走出CS地图的范围。如果通过安全的位置点无法到达老家,则输出“GAME OVER”

Sample Input

5 5
***XX
*@XXX
**XX#
***X*
*****

Sample Output

8


#include<stdio.h>
int a[4][2]={-1,0,0,-1,0,1,1,0};
int b[100][100]={0},m,n,min=0;
char s[100][100];
void sort(int x,int y,int sum)
{
int i;
if(s[x][y]=='#'||sum>=min)
{
if(min>sum)min=sum;
return;
}
for(i=0;i<4;i++)
if(x+a[i][0]>=0&&y+a[i][1]>=0&&x+a[i][0]<m&&y+a[i][1]<n)
if(!b[x+a[i][0]][y+a[i][1]]&&s[x+a[i][0]][y+a[i][1]]!='X')
{
b[x+a[i][0]][y+a[i][1]]=1;
sort(x+a[i][0],y+a[i][1],sum+1);
b[x+a[i][0]][y+a[i][1]]=0;
}
}
void main()
{
int i,j,x=-1,y;
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
{
scanf("%s",s[i]);
for(j=0;j<n&&x==-1;j++)
if(s[i][j]=='@')x=i,y=j,b[i][j]=1;
}
min=m*n,sort(x,y,0);
if(min==m*n)printf("GAME OVER\n");
else printf("%d\n",min);
}

posted @ 2013-08-02 11:02  失眠的娃儿  阅读(219)  评论(0编辑  收藏  举报