柜[非正解]

来源:互联网 发布:nemo软件好用么 编辑:程序博客网 时间:2024/04/28 15:34

参考网上的题解
非正解

正反搜一遍
交汇的地方就能放镜子

#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 longusing 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;}
原创粉丝点击