Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

即使AC也不一定正确...想提高的看看(我认为)正确的代码吧

Posted by kaitian5201314 at 2010-09-02 17:44:06 on Problem 1101
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
const int maxn=80;

char g[maxn][maxn];

bool vis[maxn][maxn];

int dis[maxn][maxn];

int go[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

int x1,y1,x2,y2;

int w,h;

void bfs(int x,int y)
{
    queue <int> q;

    int tmp=x*(w+2)+y;

    q.push(tmp);

    vis[x][y]=true;

    while(!q.empty())
    {
        tmp=q.front();

        x=tmp/(w+2);

        y=tmp%(w+2);

       
        q.pop();

        if(x==x2 && y==y2) return;

        for(int i=0;i<4;i++)
        {
            int nx=x+go[i][0];
            int ny=y+go[i][1];
			
			//这种做法才是正确的:一走到底,绝不回头
			//有点DFS的味道,就是一行一列走到底

            while(nx>=0 && nx<=h+1 && ny>=0 && ny<=w+1 && !vis[nx][ny] && g[nx][ny]!='X')
            {
                tmp=nx*(w+2)+ny;
                vis[nx][ny]=true;
                dis[nx][ny]=dis[x][y]+1;
                q.push(tmp); 
                nx=nx+go[i][0];
                ny=ny+go[i][1];       
            }
                   
        }
    }
}

int main()
{
	int i;

	freopen("1.txt","r",stdin);

    int k=0;

    while(scanf("%d%d",&w,&h)!=EOF && (w||h))
    {
        memset(g,0,sizeof(g));

        for(i=1;i<=h;i++)
        {
            getchar();

            for(int j=1;j<=w;j++)
                scanf("%c",&g[i][j]);
        }
       
        printf("Board #%d:\n",++k);

        int t=0;

        while(scanf("%d%d%d%d",&y1,&x1,&y2,&x2) && (x1||y1||x2||y2))
        {
            memset(vis,false,sizeof(vis));

            memset(dis,0,sizeof(dis));

            g[x2][y2]=0;

            bfs(x1,y1); 

            if(dis[x2][y2]==0)
				printf("Pair %d: impossible.\n",++t);
            else 
                printf("Pair %d: %d segments.\n",++t,dis[x2][y2]);

            g[x2][y2]='X';    //注意还原                                      
        } 

        printf("\n");                            
    }
    return 0;    
}

感谢http://hi.baidu.com/shouzhewei/blog/item/de55b8b6a40fcf7e8ad4b247.html
在网上找的一个AC过的正确代码,谢谢大牛  我稍微改了一下,sorry了

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator