2015年1月28日 星期三

TIOJ 1022 H.跑跑卡恩車

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
using namespace std;
int n,m;
bool flag[105][105];
int mm[105][105];
int ans[105][105];
struct qq{
    int x,y,z;
};
queue <qq> q;
void add_q(int x,int y,int z){
    qq tq;
    tq.x=x; tq.y=y; tq.z=z;
    q.push(tq);
    ans[x][y]=z;
    flag[x][y]=false;
}
int main(){
    int k;
    scanf("%d",&k);
    while(k-- >0){
        scanf("%d %d",&n,&m);
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++){
                scanf("%d",&mm[i][j]);
                flag[i][j]=true;
            }
        //q.clear();
        while(!q.empty())
            q.pop();
        qq qqq;
        qqq.x=0; qqq.y=0; qqq.z=0;
        q.push(qqq);
        ans[0][0]=0;
        flag[0][0]=false;
        //bfs
        int x=0,y=0;
        int now=0;
        while(flag[n-1][m-1]){
            while(now==q.front().z){
                x=q.front().x;
                y=q.front().y;
                q.pop();
                //up
                if(x-1>=0)
                    if(flag[x-1][y] && abs(mm[x][y]-mm[x-1][y])<=5)
                        add_q(x-1,y,now+1);
                //left
                if(y-1>=0) 
                    if(flag[x][y-1] && abs(mm[x][y]-mm[x][y-1])<=5)
                    add_q(x,y-1,now+1);
                //down
                if(x+1<n)
                    if(flag[x+1][y] && abs(mm[x][y]-mm[x+1][y])<=5)
                    add_q(x+1,y,now+1);
                //right
                if(y+1<m)
                    if(flag[x][y+1] && abs(mm[x][y]-mm[x][y+1])<=5)
                    add_q(x,y+1,now+1);
            }
            now++;
        }
        printf("%d\n",ans[n-1][m-1]);
    }
}

沒有留言:

張貼留言