棋盘

传送门

此题为2017普及组T3

思路较为简单,一个广搜就足够了

但是写什么一定要清楚

别像我一样不小心加上这句话调了半年

temp[x][y]=0;

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define dwn(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
int n,m,a[1010][1010],d[1010][1010],temp[1010][1010];
int dictx[4]={1,-1,0,0},dicty[4]={0,0,1,-1};
queue<P> que;
void bfs()
{
    d[1][1]=0;
    que.push(P(1,1));
    while(!que.empty())
    {
        int x=que.front().first,y=que.front().second;
        que.pop();
        if(x*y==0) continue;
        for(int i=0;i<4;++i)
        {
            int dx=dictx[i],dy=dicty[i];
            if(a[x+dx][y+dy]==0&&a[x][y]!=0)
            {
                if(d[x+dx][y+dy]>d[x][y]+2)
                {
                    d[x+dx][y+dy]=d[x][y]+2;
                    temp[x+dx][y+dy]=a[x][y];
                    que.push(P(x+dx,y+dy));
                }
                else if(d[x+dx][y+dy]==d[x][y]+2)
                {
                    if(temp[x+dx][y+dy]!=a[x][y])
                        temp[x+dx][y+dy]=10;
                }
            }
            if(a[x+dx][y+dy]!=0&&a[x][y]!=0&&a[x][y]!=a[x+dx][y+dy])
            {
                if(d[x+dx][y+dy]>d[x][y]+1)
                {
                    d[x+dx][y+dy]=d[x][y]+1;
                    que.push(P(x+dx,y+dy));
                }
            }
            if(a[x+dx][y+dy]!=0&&a[x][y]==0)
            {
                if(temp[x][y]==a[x+dx][y+dy]||temp[x][y]==10)
                {
                    if(d[x+dx][y+dy]>d[x][y])
                    {
                        d[x+dx][y+dy]=d[x][y];
                        que.push(P(x+dx,y+dy));
                    }
                }
                else if(temp[x][y]!=0)
                {
                    if(d[x+dx][y+dy]>d[x][y]+1)
                    {
                        d[x+dx][y+dy]=d[x][y]+1;
                        que.push(P(x+dx,y+dy));
                    }
                }
                //temp[x][y]==0;
            }
            if(a[x+dx][y+dy]!=0&&a[x][y]!=0&&a[x][y]==a[x+dx][y+dy])
            {
                if(d[x+dx][y+dy]>d[x][y])
                {
                    d[x+dx][y+dy]=d[x][y];
                    que.push(P(x+dx,y+dy));
                }
            }
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    memset(d,127,sizeof(d));
    rep(i,1,m)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        a[x][y]=z+1;
    }
    bfs();
    if(d[n][n]!=d[0][0])
    {
        printf("%d
",d[n][n]);
    }
    else printf("-1
");
    return 0;
}

原文地址:https://www.cnblogs.com/MYsBlogs/p/10930487.html