调试心得——以HDU-1010为例

来源:互联网 发布:mac os x 10.11.6 u盘 编辑:程序博客网 时间:2024/05/16 08:54

一道小题,调试了将近一个小时——本打算今天多做两道题,目前来看目标无法实现。

这道题我几个月之前做过,今天重做一遍,结果TLE。于是我翻出几个月之前的AC代码,慢慢地把AC代码改成TLE代码,最后在群里网友的帮助下,找到了BUG。最终的AC代码是这样的,你可以从中看出之前的BUG。

/* * hdu-1010 tempter of the bone * mike-w * 2012-3-24 ****************************************************** * lisence: cc3.0 */#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_SIZE 10char maze[MAX_SIZE][MAX_SIZE];int tag[MAX_SIZE][MAX_SIZE];int dd[4][2]={1,0,-1,0,0,1,0,-1};int N,M,T,FLAG;int search(int x, int y, int d){    if(d>=T)    {        if(maze[x][y]=='D')            FLAG=1;return 0;}    /*tag[x][y]=1;*/maze[x][y]='X';   int i,x1,y1;    for(i=0;i<4&&!FLAG;i++)    {        x1=x+dd[i][0];        y1=y+dd[i][1];        if(x1>=0 && x1<N && y1>=0 && y1<M&& (maze[x1][y1]=='.' || (d==T-1 && maze[x1][y1]=='D'))            /*&& !tag[x1][y1]*/)   search(x1,y1,d+1);    }    /*tag[x][y]=0;*/maze[x][y]='.';    return 0;}        int main(void){#ifndef ONLINE_JUDGE    freopen("in","r",stdin);#endif    int i,j,sx,sy,tx,ty,area;    while(scanf("%d%d%d",&N,&M,&T),M||N||T)    {        memset(tag,0,sizeof(tag));        for(i=0;i<N;i++)            scanf("%s",maze[i]);        area=0;        for(i=0;i<N;i++)            for(j=0;j<M;j++)            {                if(maze[i][j]=='.')                    area++;                if(maze[i][j]=='S')                    sx=i,sy=j;                if(maze[i][j]=='D')                    tx=i,ty=j;            }FLAG=0;maze[sx][sy]='X';        if(((abs(sx-tx)+abs(sy-ty))&0x1) != (T&0x1))            puts("NO");        else if(area+1<T)            puts("NO");        else            puts((search(sx,sy,0),FLAG)?"YES":"NO");    }    return 0;}

程序里的BUG是,程序执行过程中把D点修改成了空白点,进而导致TLE。所以回溯的时候要仔细审查操作前后的变化,自己是否把所有状态都进行了恢复。

又是印象深刻的一课。

原创粉丝点击