读书人

帮忙测试下 hdu 1010 !该怎么解决

发布时间: 2012-04-18 15:01:59 作者: rapoo

帮忙测试下 hdu 1010 !!!!!!!
http://acm.hdu.edu.cn/showproblem.php?pid=1010
帮忙提供错误的测试数据咯,能帮我找出错误更好!!!!!

C/C++ code
#include<iostream>#include<stack>#include<fstream>////#define INF 100000#define N 51using namespace std;class shortestPath{private:    int n;//顶点总数    int u;//入口点    int d;//出口点    int arrTemp[N][N];    int array[N][N];    int weightPath[N][N];public:    shortestPath(int arr[N][N], int s, int e, int m){        n = m;        u = s;        d = e;        memset(array, 0, sizeof(array));        memset(arrTemp, 0, sizeof(arrTemp));        memset(weightPath, 0, sizeof(weightPath));        for(int i=0; i<=n; i++)//这个地方可以有好的方法吗??            for(int j=0; j<n; j++)                array[i][j]=arr[i][j];        fun();    }    void fun();//算法过程    int getValue();//取u到d的最短路径权值    ~shortestPath(){ };};void shortestPath::fun(){        int queue[N] = {0};//模拟队列        int temp;//中间转储        int flagH=0,flagR=0;//队头与队尾        queue[flagR] = u;        flagR++;        temp = queue[flagH];        for(int i=0; i<n; i++){//初始化入口点的最短距离            arrTemp[temp][i] = array[temp][i]!=0 ? array[temp][i] : INF;            arrTemp[ n  ][i] = array[temp][i]!=0 ? array[temp][i] : INF;            if(array[temp][i] != INF && temp != i){                queue[flagR] = i;                flagR++;            }        }        flagH++;        //计算过程中各结点路径最小值        while(flagH < flagR){            temp = queue[flagH];            flagH++;            for(int i=0; i<n; i++){                if(array[temp][i] >= INF || temp == i) arrTemp[temp][i] = INF;/////!!!!!!!!!                else{                    //计算过程路径值                    if(arrTemp[i][temp]!= 0){                        if(arrTemp[n][temp] - array[temp][i] == arrTemp[n][i]                                || arrTemp[i][temp] - array[temp][i] == 0)                            arrTemp[temp][i] = arrTemp[n][temp];                        else arrTemp[temp][i] = array[temp][i] + arrTemp[n][temp];                    }                    else arrTemp[temp][i] = array[temp][i] + arrTemp[n][temp];                    //重新确定当前结点的最短路径                    arrTemp[n][i] = arrTemp[n][i] < arrTemp[temp][i] ?                            arrTemp[n][i] : arrTemp[temp][i];                    //判断当前结点是否需要入栈                    int flag = 1;                    for(int j=0; j<flagR; j++)                        if(i == queue[j]){                            flag=0;  break;                        }                    if(flag == 1){                        queue[flagR] = i;                        flagR++;                    }                }            }        }        //确定入口点到各点的最短路径经过的顶点        arrTemp[n][u] = 0;        int x=0,k;        for(int i=0; i<n; i++){            k=2;            if(i == u) continue;            weightPath[i][0] = arrTemp[n][i];            weightPath[i][k++] = i;            x = i;            temp = arrTemp[n][i];            //确定最小路径的终点            while(temp>0){                //确定中间点                for(int j=0; j<n; j++){                    if(temp == arrTemp[j][x]){                        temp -= array[j][x];                        weightPath[i][k++] = j;                        if(temp == 0){                            weightPath[i][k] = u;                            weightPath[i][1] = k-2;                        }                        break;                    }                }                for(int h=0; h<n; h++){                    if(h == u) continue;                    if(temp == arrTemp[n][h]) x=h;                }            }        }}int shortestPath::getValue(){    return weightPath[d][0];}int main(){     ifstream cin("hdu.txt");////    int n, m, t;    char a[10][10];    int start[2], door[2];    while(cin>>n>>m>>t && (n!=0||m!=0||t!=0)){        int g[N][N] = {0};        for(int i=0; i<n; i++)            for(int j=0; j<m; j++){                cin>>a[i][j];                if(a[i][j]=='S')                    start[0]=i, start[1]=j;                if(a[i][j]=='D')                    door[0]=i, door[1]=j;            }        //转换成图的结构        for(int i=0; i<n; i++){            for(int j=0; j<m; j++){                if(a[i][j] != 'X'){                    if(a[i-1][j]!='X' && i-1>=0) g[i*m+j][(i-1)*m+j]=1;                    if(a[i+1][j]!='X' && i+1<n) g[i*m+j][(i+1)*m+j]=1;                    if(a[i][j-1]!='X' && j-1>=0) g[i*m+j][i*m+j-1]=1;                    if(a[i][j+1]!='X' && j+1<m) g[i*m+j][i*m+j+1]=1;                }            }        }        //将无连接的两个点赋值无穷大        for(int i=0; i<n*m; i++)            for(int j=0; j<n*m; j++)                if(g[i][j]!=1 && i!=j) g[i][j]=INF;        int s=start[0]*m+start[1];        int d=door[0]*m+door[1];        shortestPath hdu(g, s, d, n*m);        if(hdu.getValue()<=t) cout<<"YES"<<endl;        else cout<<"NO"<<endl;    }    return 0;} 



[解决办法]
那我帮你顶一下吧,呵呵

这是我AC的代码:
C/C++ code
#include <iostream>#include <cmath>using namespace std;char map[9][9];int n, m, t, dx, dy;bool escape;int dir[4][2] = {{0,-1}, {0,1}, {1,0}, {-1,0}};void Dfs(int sx, int sy, int cnt);int main(){    int i, j, sx, sy;    while(cin >> n >> m >> t)    {        if(0==n && 0==m && 0==t)            break;        int wall = 0;        for(i=1;i<=n;i++)        {            for(j=1;j<=m;j++)            {                cin >> map[i][j];                if('S' == map[i][j])                {                    sx = i;                    sy = j;                }                else if('D' == map[i][j])                {                    dx = i;                    dy = j;                }                else if('X' == map[i][j])                    wall++;            }        }        if(n*m-wall <= t)        {            cout << "NO" << endl;            continue;        }        escape = false;        map[sx][sy] = 'X';        Dfs(sx, sy, 0);        if(escape)            cout << "YES" << endl;        else            cout << "NO" << endl;    }    return 0;}void Dfs(int sx, int sy, int cnt){    int i, temp;    if(sx>n || sx<=0 || sy>m || sy<=0)        return;    if(cnt==t && sx==dx && sy==dy)        escape = true;    if(escape)        return;    temp = (t-cnt) - abs(sx-dx) - abs(sy-dy);    if(temp<0 || temp%2==1)        return;    for(i=0;i<4;i++)    {        if('X' != map[sx+dir[i][0]][sy+dir[i][1]])        {            map[sx+dir[i][0]][sy+dir[i][1]] = 'X';            Dfs(sx+dir[i][0], sy+dir[i][1], cnt+1);            map[sx+dir[i][0]][sy+dir[i][1]] = '.';        }    }    return;}
[解决办法]
请试以下输入:

2 2 3
D.
.S

正确输出是NO,但LZ程序输出YES.请注意题目要求是the doggie had to arrive at the door on exactly the T-th second

读书人网 >软件架构设计

热点推荐