现在的位置: 首页 > 综合 > 正文

hdu_1429 胜利大逃亡(续)

2013年02月03日 ⁄ 综合 ⁄ 共 1328字 ⁄ 字号 评论关闭

 

CODE:

#include <iostream>
#include <queue>
using namespace std;
struct px
{
    int x,y,s,key,flag[10];
};
struct px start;
char map[25][25];
int mark[25][25][1025],dir[4][2]={0,1,0,-1,1,0,-1,0};//三维表,走过的路径对应表的状态
int wys[10]={1,2,4,8,16,32,64,128,256,512};
int N,M,T;
bool panduan(px t)
{
    if(t.x>=1&&t.x<=N&&t.y>=1&&t.y<=M)
        return true;
    return false;
}
void bfs()
{
    int i;
    for(i=0;i<10;i++)
        start.flag[i]=0;
    queue<px>Q;
    Q.push(start);
    struct px t,temp;
    mark[start.x][start.y][0]=0;
    while(!Q.empty())
    {
        temp=Q.front();
        Q.pop();
        if(temp.s>=T)
            break;
        if(map[temp.x][temp.y]=='^')
        {printf("%d/n",temp.s);return;}
        for(i=0;i<4;i++)
        {
            t=temp;
            t.x+=dir[i][0];
            t.y+=dir[i][1];
            t.s=temp.s+1;
            if(panduan(t)&&mark[t.x][t.y][t.key]&&map[t.x][t.y]!='*')
            {
                if(map[t.x][t.y]>='A'&&map[t.x][t.y]<='J')
                {
                    if(t.flag[map[t.x][t.y]-'A'])
                    {
                        mark[t.x][t.y][t.key]=0;
                        Q.push(t);
                    }
                }
                else if(map[t.x][t.y]>='a'&&map[t.x][t.y]<='j')
                {
                    if(t.flag[map[t.x][t.y]-'a']==0)//除非手里没这钥匙才能加上key里去
                    {
                        t.flag[map[t.x][t.y]-'a']=1;
                        t.key+=wys[map[t.x][t.y]-'a'];
                    }
                    mark[t.x][t.y][t.key]=0;
                    Q.push(t);
                }
                else
                {
                    mark[t.x][t.y][t.key]=0;
                    Q.push(t);
                }
            }
        }
    }
	printf("-1/n");
	return;
}
int main ()
{
    int i,j,k;
    while(scanf("%d%d%d",&N,&M,&T)!=EOF)
    {
        getchar();
        for(i=0;i<=N;i++)
            for(j=0;j<=M;j++)
                for(k=0;k<1025;k++)
                    mark[i][j][k]=1;
				for(i=1;i<=N;i++)
				{
					for(j=1;j<=M;j++)
					{
						scanf("%c",&map[i][j]);
						if(map[i][j]=='@')
						{start.x=i;start.y=j;start.s=0;start.key=0;}
					}
					getchar();
				}
				bfs();
    }
	return 0;
}

 

抱歉!评论已关闭.