POJ

来源:互联网 发布:金牛软件官网 编辑:程序博客网 时间:2024/06/07 20:41

【想法】题目简单,长宽都固定了下来,直接深搜就行。就是记录路径有点障碍,稍微一想就行,还是那句话:一个人可能有多个儿子,但是一定只有一个爸爸,所以每次搜索的时候直接记录当前节点的爸爸是谁就行,然后由最后依次向前统计出路径,压到栈中,反序输出就是答案了。因为起始点和终止点都固定了下来,所以可以用特征值直接扫出答案。

【代码】

#include <cstdio>#include <cstring>#include <cmath>#include <queue>#include <stack>using namespace std;int mat[10][10];int pre[10][10];struct P{    int x,y;    P(int X,int Y):x(X),y(Y){}};queue<int>lu;int changex[4]={0,0,1,-1};int changey[4]={1,-1,0,0};int main(){    //freopen("in.txt","r",stdin);    for(int i=0;i<5;i++)        for(int j=0;j<5;j++)        {            scanf("%d",&mat[i][j]);            pre[i][j]=i*1000+j;        }    lu.push(0);    int x,y,cx,cy;    while(!lu.empty())    {        x=lu.front()/1000;        y=lu.front()%1000;        lu.pop();        for(int i=0;i<4;i++)        {            cx=x+changex[i];            cy=y+changey[i];            if(cx<0||cx>4||cy<0||cy>4||mat[cx][cy])                continue;            else if(cx==4&&cy==4)            {                pre[cx][cy]=x*1000+y;                break;            }            else if(pre[cx][cy]==cx*1000+cy)            {//这个点没有搜索过                pre[cx][cy]=x*1000+y;                lu.push(cx*1000+cy);            }        }    }    stack <P> ans;    ans.push(P(4,4));    x=4,y=4;    while(x||y)    {        cx=pre[x][y]/1000;        cy=pre[x][y]%1000;        ans.push(P(cx,cy));        x=cx,y=cy;    }    while(!ans.empty())    {        printf("(%d, %d)\n",ans.top().x,ans.top().y);        ans.pop();    }    return 0;}
0 0
原创粉丝点击