櫃[非正解]

參考網上的題解
非正解

正反搜一遍
交匯的地方就能放鏡子

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<vector>
#include<climits>
#include<string>
#include<cstdlib>
#include<ctime>
#define MOD 1000000007
#define LL long long
using namespace std;

int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,-1,1},dir1[5]={0,4,3,2,1},dir2[5]={0,3,4,1,2};
int r,c,map[7005][7005],vis[7005][7005],tot,ansx,ansy;

bool dfs1()
{
    int x=1,y=1,d=4;

    while(1)
    {
        vis[x][y]=1;

        if(map[x][y]==1) d=dir1[d];
        if(map[x][y]==2) d=dir2[d];

        x+=dx[d];
        y+=dy[d];

        if((x==0)||(x==r+1)||(y==0)||(y==c+1)) break;
    }

    if(((x==r+1&&y==c)||(x==r&&y==c+1))&&d==4) return true;
    return false;
}

void dfs2()
{
    int x=r,y=c,d=3;    

    while(1)
    {
        if((vis[x][y])&&(!map[x][y]))
        {
            tot++;

            if(x<ansx||(x==ansx&&y<ansy))
            {
                ansx=x;
                ansy=y;
            }           
        }

        if(map[x][y]==1) d=dir1[d];
        if(map[x][y]==2) d=dir2[d];

        x+=dx[d];
        y+=dy[d];

        if((x==0)||(x==r+1)||(y==0)||(y==c+1)) break;       
    }

}

void work()
{
    if(dfs1())
    {
        printf("0\n");
        return;     
    }

    dfs2();

    if(tot) printf("%d %d %d\n",tot,ansx,ansy);
    else printf("-1\n");
}


int main()
{
    freopen("safe.in","r",stdin);
    freopen("safe.out","w",stdout); 

    int m,n,i,rr,cc;

    while(scanf("%d%d%d%d",&r,&c,&m,&n)!=EOF)
    {
        memset(map,0,sizeof(map));
        memset(vis,0,sizeof(vis));              

        tot=0;
        ansx=r;
        ansy=c;


        for(i=1;i<=m;i++)
        {
            scanf("%d%d",&rr,&cc);          
            map[rr][cc]=1;
        }

        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&rr,&cc);          
            map[rr][cc]=2;          
        }

        work();
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章