HDU 1175

来源:互联网 发布:加强校园网络建设 编辑:程序博客网 时间:2024/05/29 04:33

深搜
这道题可以不完全按照深搜做,因为他的转向次数是有限的。而且很少,第一步遍历,后两步走哪就可以直接判断了,判断当前位置与终点之间的最短路是否有阻断。方向总共就四个方向,每个情况最多两种走法。

#include<stdio.h>#include<string.h>int start(int x1,int y1,int x2,int y2,int m[600][600]){    if(x1==x2&&y1==y2)//是否重合        return 0;    if(m[x1][y1]!=m[x2][y2])//是否相等        return 0;    if(m[x1][y1]==0||m[x2][y2]==0)//是否等于0        return 0;    return 1;}int discover(int x,int y,int x2,int y2,int m[600][600])//其实就是最后两步,最后的位置与终点作比较,共分四种情况,共八种走法,一一例举出来判断{    int sumx=0,sumy=0,i;    if(x2>=x&&y2>=y)    {        for(i=1; i<x2-x; i++)            sumx+=m[x+i][y];        for(i=1; i<y2-y; i++)            sumx+=m[x2][y+i];        for(i=1; i<y2-y; i++)            sumy+=m[x][y+i];        for(i=1; i<x2-x; i++)            sumy+=m[x+i][y2];        if(sumx==0||sumy==0)            return 1;        else            return 0;    }    if(x2>=x&&y2<=y)    {        for(i=1; i<x2-x; i++)            sumx+=m[x+i][y];        for(i=1; y-i>y2; i++)            sumx+=m[x2][y-i];        for(i=1; y-i>y2; i++)            sumy+=m[x][y-i];        for(i=1; i<x2-x; i++)            sumy+=m[x+i][y2];        if(sumx==0||sumy==0)            return 1;        else            return 0;    }    if(x2<=x&&y2>=y)    {        for(i=1; x-i>x2; i++)            sumx+=m[x-i][y];        for(i=1; i<y2-y; i++)            sumx+=m[x2][y+i];        for(i=1; i<y2-y; i++)            sumy+=m[x][y+i];        for(i=1; x-i>x2; i++)            sumy+=m[x-i][y2];        if(sumx==0||sumy==0)            return 1;        else            return 0;    }    if(x2<=x&&y2<=y)    {        for(i=1; x-i>x2; i++)            sumx+=m[x-i][y];        for(i=1; y-i>y2; i++)            sumx+=m[x2][y-i];        for(i=1; y-i>y2; i++)            sumy+=m[x][y-i];        for(i=1; x-i>x2; i++)            sumy+=m[x-i][y2];        if(sumx==0||sumy==0)            return 1;        else            return 0;    }}int dfs(int x1,int y1,int x2,int y2,int m[600][600]){    int i,x,y;    for(i=1; i+x1<600; i++)//向下走    {        x=x1+i;        y=y1;        if(x1+i==x2&&y1==y2) //先判断是否已经到了            return 1;        if(m[x1+i][y1]!=0)  //已经判断到了不可通行的位置,所以这个方向的行走该结束了            break;        if(discover(x,y,x2,y2,m))//已经发现满足条件的路,返回main            return 1;    }    for(i=1; i+y1<600; i++)//向右走,上面朝下走不行,从起点开始向右走    {        x=x1;        y=y1+i;        if(x1==x2&&y1+i==y2)            return 1;        if(m[x1][y1+i]!=0)            break;        if(discover(x,y,x2,y2,m))            return 1;    }    for(i=1; x1-i>=0; i++)//向上走    {        x=x1-i;        y=y1;        if(x1-i==x2&&y1==y2)            return 1;        if(m[x1-i][y1]!=0)            break;        if(discover(x,y,x2,y2,m))            return 1;    }    for(i=1; y1-i>=0; i++)//向左走    {        x=x1;        y=y1-i;        if(x1==x2&&y1-i==y2)            return 1;        if(m[x1][y1-i]!=0)            break;        if(discover(x,y,x2,y2,m))            return 1;    }    return 0;}int main (){    int n,m,i,j,q,x1,y1,x2,y2,e,f,map[600][600];    while(scanf("%d%d",&n,&m)!=EOF)    {        if(n==0&&m==0)        break;        memset(map,-1,sizeof(map));        for(i=1; i<=n; i++)        {            for(j=1; j<=m; j++)            {                scanf("%d",&map[i][j]);            }        }        scanf("%d",&q);        while(q--)        {            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);            if(start(x1,y1,x2,y2,map))            {                if(dfs(x1,y1,x2,y2,map))                    printf("YES\n");                else                    printf("NO\n");            }            else                printf("NO\n");        }    }    return 0;}


2 0