CSU 1259 跳跳

来源:互联网 发布:win10系统网络感叹号 编辑:程序博客网 时间:2024/09/21 09:02

1259: 跳跳

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 354  Solved: 92
[Submit][Status][Web Board]

Description

 一个每块地板标记着0~9某个数字的迷宫,其中标记1的地板不可以走,标记2~9的地板可以不花时间地跳到任意相同数字的位置,也可以和标记0的地板一样向前后左右任意方向花1个单位时间移动1的距离。给出起点和终点,求起点到终点的最短时间。

Input

 每组数据第一行一个n,表示尺寸,2 <= n <= 100。

接下来n行每行n个0~9的字符,或S表示起点,E表示终点,S和E的运动规则与0相同。整个地图只有一个S和一个E。

Output

 每组数据输出一个数,占一行,表示起点到终点可以花费的最短时间。

如果无法到达重点,输出"Oh No!"

Sample Input

50S100001310030000000003E03S1201010E

Sample Output

4Oh No!

HINT

汉字题意  我喜欢

AC 代码

#include <iostream>#include <stdio.h>#include <queue>#include <string.h>using namespace std;int  a[110][110],vis[110][110], pace[110][110],n;int  m[4][2]= {0,1,1,0,0,-1,-1,0};int seak(int x,int y){    if(x>=0&&x<n&&vis[x][y]==0&&a[x][y]!=1&&y>=0&&y<n)   //判断条件        return 1;    return 0;}int bfs(int x1,int y1,int x2,int y2){    int c,l,r;    queue<int> Q,Q1,Q2;    Q.push(a[x1][y1]);  //记录该点    Q1.push(x1);       //记录该点的X坐标    Q2.push(y1);       //Y坐标    vis[x1][y1]=1;    while(!Q.empty())    {        c=Q.front();        Q.pop();        x1=Q1.front();        Q1.pop();        y1=Q2.front();        Q2.pop();        if(x1==x2&&y1==y2)            return pace[x1][y1];        for(int i=0; i<4; i++)        {            l=x1+m[i][0],r=y1+m[i][1];            if(seak(l,r))            {                Q.push(a[l][r]);                Q1.push(l);                Q2.push(r);                vis[l][r]=1;                pace[l][r]=pace[x1][y1]+1;                if(a[l][r]>=2&&a[l][r]<=9)                {                    for(int i=0; i<n; i++)                        for(int j=0; j<n; j++)                        {                            if(a[i][j]==a[l][r]&&vis[i][j]==0)                            {                                Q.push(c);                                Q1.push(i);                                Q2.push(j);                                vis[i][j]=1;                                pace[i][j]=pace[l][r];                            }                        }                }            }        }    }    return -1;}int main(){    char c;    int i,j,x1,y1,x2,y2,ans;    while(cin >> n)    {        getchar();        memset(vis,0,sizeof(vis));        memset(pace,0,sizeof(pace));        memset(a,0,sizeof(a));        for(i=0; i<n; i++)        {            for(j=0; j<n; j++)            {                cin >> c;                if(c=='S')                {                    x1=i,y1=j;                    a[i][j]=0;                }                else if(c=='E')                {                    x2=i,y2=j;                    a[i][j]=0;                }                else                    a[i][j]= c-48;            }            getchar();        }        ans=bfs(x1,y1,x2,y2);        if(ans==-1)            cout << "Oh No!"<<endl;        else            cout << ans << endl;    }    return 0;}


0 0
原创粉丝点击