写出来啦,但是超时,参考了一下别人答案,理解一下

原题意
邮政货车
【题目描述】vans.pas
郊区呈矩形,有N(N<=3)条东西方向的街道和M(M<=126)条南北方向的街道.在交区的西北角有一个邮局。
如N=3,M=4 时,郊区如右图所示,圆点表示邮局,直线表示街道。
每天邮政卡车从邮局出发,每个交叉路口(包括边界和四角)经过且只经过一次,最终回到邮局。现在邮局希望知道邮政货车不同的行驶路线共有几种。
【输入文件】 vans.in
一行,包括两个数字N和M。输入数据保证货车一定能够完成任务并回到邮局。
【输出文件】vans.out
一个数字,为邮政货车不同行驶路线的数量。
【输入输出样例】
vans.in vans.out

运行超时的代码...

#include <stdio.h>
#include <stdlib.h>
using namespace std;
static const int cols = 1000;
int psize=0;
//路径数组,可行的方法,坐标,经过的节点
void getTotle(int a[4][1000],int &totle,int x,int y,int num){
    if(num<psize){
        a[x][y] = 1;
        num++;
        //向上
        if(x>0&&a[x-1][y]==0){
            getTotle(a,totle,x-1,y,num);
            a[x-1][y] = 0;

        }
        //向右
        if(y<psize/4-1&&a[x][y+1]==0){
            getTotle(a,totle,x,y+1,num);
            a[x][y+1] = 0;

        }
        //向下
        if(x<3&&a[x+1][y]==0){
            getTotle(a,totle,x+1,y,num);
            a[x+1][y] = 0;

        }
        //向左
        if(y>0&&a[x][y-1]==0){
            getTotle(a,totle,x,y-1,num);
            a[x][y-1] = 0;

        }
    }else{
        //最后一个节点为(0,0)
        if(x==0&&y==0){
            totle++;
        }
    }
}

int main()
{
    int totle = 0,col = 0;
    scanf("%d",&col);
    psize = 4*col;
    int path[4][cols];
    //初始化坐标数组
    getTotle(path,totle,0,1,1);
    printf("%d",totle*2);
    return 0;
}

0 条评论

目前还没有评论...

信息

ID
1435
难度
5
分类
动态规划 | 状态压缩DP递推 点击显示
标签
(无)
递交数
1219
已通过
438
通过率
36%
被复制
6
上传者