ACM超时问题

  上次听学长说,关于标记数组最好换成布尔型的,节约空间时间,一直不以为然,直到做到Codeforces Round #442 (Div. 2)D. Olya and Energy Drinks的时候一直在44组测试数据超时,花了超长时间才发现是标记数组类型这里拉长了时间QAQ。这次一定记住了!!!(跟普通走迷宫的不同之处在于能走多步而已)

附上代码

#include <iostream>
#include <queue>
using namespace std;
const int maxn=1e3+10;
char arr[maxn][maxn];
bool book[maxn][maxn];
int dx[]={-1,0,1,0}, dy[]={0,-1,0,1};
int n, m, k;
int x1, y1, x2, y2;
struct node{
    int x, y;
    int step;
}temp;
queue<node>q;
int bfs(){
    if(x1==x2&&y1==y2){
        return 0;
    }
    temp.x=x1;
    temp.y=y1;
    temp.step=0;
    q.push(temp);
    book[x1][y1]=1;
    while(!q.empty()){
        temp=q.front();
        q.pop();
        int x=temp.x,y=temp.y,step=temp.step;
        for(int i=0;i<4;i++){
            for(int j=1;j<=k;j++){
                int nx=x+dx[i]*j;
                int ny=y+dy[i]*j;
                if(nx==x2&&ny==y2){
                    return step+1;
                }
                if(nx<0||nx>=n||ny<0||ny>=m||arr[nx][ny]=='#'){
					break;
				}
				if(book[nx][ny]==0){
					book[nx][ny]=1;
					temp.x=nx;
					temp.y=ny;
					temp.step=step+1;
					q.push(temp);
				}
            }
        }
    }
    return -1;
}
int main(){
    cin>>n>>m>>k;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        cin>>arr[i][j];
    cin>>x1>>y1>>x2>>y2;
    x1--;
    y1--;
    x2--;
    y2--;
    cout<<bfs()<<endl;
    return 0;
}

 

posted @ 2018-08-24 15:02  UUUUh  阅读(629)  评论(0编辑  收藏  举报