NYOJ999 师傅又被妖怪抓走了

只记得当下的眼疼 , ok 各种数据也试了 , 就是 他娘的不对 , 我也是醉了 . 也是日了最野的狗

附上日了哮天犬的代码 , 这个题 先放放, 一段时间后再试试 , 明天开始状态压缩吧 .为期两天

今天早上 一眼就看出来了 代码的  漏洞 , 以后应该 自己想不出来的代码 让别人看看   ,   互相交换着看看  

预处理 + 两重广搜 

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<math.h>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<queue>
  7 #include<vector>
  8 #include<set>
  9 #include<stack>
 10 #include<string>
 11 #include<sstream>
 12 #include<map>
 13 #include<cctype>
 14 using namespace std;
 15 int n,m,b[4][2]={0,-1,0,1,-1,0,1,0},minn,visited[105][105],vis[105][105];
 16 char a[105][105];
 17 struct monkey
 18 {
 19     int x,y,step;
 20 };
 21 queue<monkey>Q;
 22 void pretreatment(int x,int y,char b,char c)   //坐标 和 该名称  和  另一人名称
 23 {
 24     for(int i=x+1;i<m&&a[y][i]!='X'&&a[y][i]!=c;i++)
 25         a[y][i]=(a[y][i]=='d'?'O':b+32);
 26     for(int i=x-1;i>=0&&a[y][i]!='X'&&a[y][i]!=c;i--)
 27         a[y][i]=(a[y][i]=='d'?'O':b+32);
 28     for(int i=y+1;i<n&&a[i][x]!='X'&&a[i][x]!=c;i++)
 29         a[i][x]=(a[i][x]=='d'?'O':b+32);
 30     for(int i=y-1;i>=0&&a[i][x]!='X'&&a[i][x]!=c;i--)
 31         a[i][x]=(a[i][x]=='d'?'O':b+32);
 32 }
 33 queue<monkey>W;
 34 void BFSMORE(int x,int y,int step,char c)
 35 {
 36     monkey q={x,y,step};
 37     W.push(q);
 38     while(!W.empty())
 39     {
 40         monkey e=W.front();
 41         W.pop();
 42         for(int i=0;i<4;i++)
 43         {
 44             q.x=e.x+b[i][0],q.y=e.y+b[i][1];
 45             if(a[q.y][q.x]!='X'&&a[q.y][q.x]!='D'&&a[q.y][q.x]!='E'&&q.x>=0&&q.x<m&&q.y>=0&&q.y<n&&!vis[q.y][q.x])
 46             {
 47                 vis[q.y][q.x]=1;
 48                 q.step=e.step+1;
 49                 W.push(q);
 50                 if(a[q.y][q.x]==c||a[q.y][q.x]=='O')
 51                 {
 52                     minn=minn>q.step?q.step:minn;
 53                     while(!W.empty())
 54                         W.pop();
 55                     break;
 56                 }
 57             }
 58         }
 59     }
 60 }
 61 void BFS(int x,int y)
 62 {
 63     monkey q={x,y,0};
 64     if(a[y][x]=='O')
 65     {
 66         minn=0;
 67         return ;
 68     }
 69     if(a[y][x]=='d')
 70     {
 71         memset(vis,0,sizeof(vis));
 72         BFSMORE(x,y,0,'e');
 73     }
 74     if(a[y][x]=='e')
 75     {
 76         memset(vis,0,sizeof(vis));
 77         BFSMORE(x,y,0,'d');
 78     }
 79     Q.push(q);
 80     while(!Q.empty())
 81     {
 82         monkey e=Q.front();
 83         Q.pop();
 84         for(int i=0;i<4;i++)
 85         {
 86             q.x=e.x+b[i][0],q.y=e.y+b[i][1];
 87             if(a[q.y][q.x]!='X'&&a[q.y][q.x]!='D'&&a[q.y][q.x]!='E'&&q.x>=0&&q.x<m&&q.y>=0&&q.y<n&&!visited[q.y][q.x])
 88             {
 89                 q.step=e.step+1;
 90                 Q.push(q);
 91                 visited[q.y][q.x]=1;
 92                 if(a[q.y][q.x]=='O')
 93                 {
 94                     minn=minn>q.step?q.step:minn;
 95                 }
 96                 if(a[q.y][q.x]=='d')
 97                 {
 98                     memset(vis,0,sizeof(vis));
 99                     BFSMORE(q.x,q.y,q.step,'e');
100                 }
101                 if(a[q.y][q.x]=='e')
102                 {
103                     memset(vis,0,sizeof(vis));
104                     BFSMORE(q.x,q.y,q.step,'d');
105                 }
106             }
107         }
108     }
109 }
110 int main()
111 {
112     int sx,sy,dx,dy,ex,ey,t,count1=0;
113     while(scanf("%d%d%d",&n,&m,&t)!=EOF)
114     {
115         minn=t+1;
116         for(int i=0;i<n;i++)
117         {
118             for(int j=0;j<m;j++)
119             {
120                 scanf(" %c",&a[i][j]);
121                 if(a[i][j]=='S')
122                 {
123                     sx=j;
124                     sy=i;
125                 }
126                 if(a[i][j]=='D')
127                 {
128                     dx=j;
129                     dy=i;
130                 }
131                 if(a[i][j]=='E')
132                 {
133                     ex=j;
134                     ey=i;
135                 }
136             }
137         }
138         pretreatment(dx,dy,'D','E');
139         pretreatment(ex,ey,'E','D');
140         memset(visited,0,sizeof(visited));
141         visited[sy][sx]=1;
142         BFS(sx,sy);
143         printf("Case %d:\n",++count1);
144         if(minn<=t)
145             printf("%d\n",minn);
146         else
147             printf("-1\n");
148     }
149     return 0;
150 }

 

posted @ 2016-04-02 21:16  X-POWER  阅读(237)  评论(0编辑  收藏  举报