TRDD got lost again
生活随笔
收集整理的這篇文章主要介紹了
TRDD got lost again
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://ac.nowcoder.com/acm/contest/322/B
C++版本一
題解:BFS+狀態壓縮
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int using namespace std; typedef long long ll; //typedef __int128 lll; const int N=4000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,ans; int a[54000][4000]; char str[7000]; int sx,sy,tx,ty; int b[9][2]; struct node{int x,y;int cnt; }f,s,tmp; bool vis[N][N]; int bfs(){s.x=sx;s.y=sy;s.cnt=0;queue<node>q;q.push(s);b[1][0]=0;b[1][1]=-1;b[2][0]=1;b[2][1]=0;b[4][0]=0;b[4][1]=1;b[8][0]=-1;b[8][1]=0;vis[sx][sy]=1;while(!q.empty()){f=q.front();q.pop();tmp=f;tmp.cnt++;if(f.x==tx&&f.y==ty){return f.cnt;}for(int i=1;i<=8;i*=2){int tmd=i&a[1][1];if((int)(a[f.x][f.y]&i)==i){tmp.x=f.x+b[i][1];tmp.y=f.y+b[i][0];if(0<tmp.x&&tmp.x<=n&&0<tmp.y&&tmp.y<=m&&!vis[tmp.x][tmp.y]){vis[tmp.x][tmp.y]=1;//cout<<tmp.x<<tmp.y<<tmd<<endl;q.push(tmp);}}}}return -1; } int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endifscanf("%d%d",&n,&m);getchar();for(int i=1;i<=2*n+1;i++){gets(str);if(i%2){for(int j=1;j<=2*m+1;j+=2){if(str[j]==' '){a[(i+1)/2][(j+1)/2]+=1;a[(i+1)/2-1][(j+1)/2]+=4;}}}else{for(int j=0;j<=2*m+1;j+=2){if(str[j]==' '){a[(i+1)/2][j/2]+=2;a[(i+1)/2][j/2+1]+=8;}}for(int j=1;j<=2*m+1;j+=2){if(str[j]=='S'){sx=i/2;sy=(j+1)/2;}if(str[j]=='T'){tx=i/2;ty=(j+1)/2;}}}} // for(int i=1;i<=n;i++){ // for(int j=1;j<=m;j++){ // cout << a[i][j] ; // } // cout<< endl; // }ans=bfs();if(ans==-1)cout << "TRDD Got lost...TAT" << endl;elsecout << ans+1 << endl;//cout << "Hello world!" << endl;return 0; }C++版本二
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG using namespace std; #define RI register int const int mx=2*3000+100; int n,m; int sx,sy,tx,ty; char mp[mx][mx]; int vis[mx][mx]; int dif[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; struct Node {int x;int y;int step; }zb,st; queue<Node>q; int bfs(int a,int b) {st.x=a;st.y=b;vis[a][b]=1;st.step=1;q.push(st);while (!q.empty()){zb=q.front();q.pop();//printf("(%d,%d)->",zb.x,zb.y);if (zb.x==tx&&zb.y==ty) return zb.step;for (int i=0;i<4;++i){st.x=zb.x+dif[i][0];st.y=zb.y+dif[i][1];st.step=zb.step+1;if (st.x==tx&&st.y==ty) return st.step;if (st.x<1||st.x>2*n+1||st.y<1||st.y>2*m+1) continue;if (mp[st.x][st.y]!=' ') continue;if (i<=1){if (mp[st.x][st.y-1]=='+'&&mp[st.x][st.y+1]=='+'){st.x=st.x+dif[i][0];st.y=st.y+dif[i][1];}}else{if (mp[st.x+1][st.y]=='+'&&mp[st.x-1][st.y]=='+'){st.x=st.x+dif[i][0];st.y=st.y+dif[i][1];}}if (vis[st.x][st.y]) continue;vis[st.x][st.y]=1;q.push(st);}}return 0; } int main() {scanf("%d%d",&n,&m);getchar();int x=2*n+1,y=2*m+1;for (int i=1;i<=x;++i){gets(mp[i]+1);for (int j=1;j<=y;++j){if (mp[i][j]=='S'){sx=i;sy=j;}else if (mp[i][j]=='T'){tx=i;ty=j;}}}int res=bfs(sx,sy);if (res) printf("%d\n",res);else printf("TRDD Got lost...TAT\n"); }?
總結
以上是生活随笔為你收集整理的TRDD got lost again的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dreamstart的催促
- 下一篇: Company