一点点有意思的题目
1.逃离中山路
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pii; const ll N=1010; ll way[N][N]; ll n,x1,y3,x2,y2; ll dx[]={1,0,-1,0}; ll dy[]={0,1,0,-1}; ll st[N][N]; ll bfs(ll x1,ll y3,ll x2,ll y2){ queue<pii> arr; arr.push({x1,y3}); st[x1][y3]=0; while(!arr.empty()) { ll x=arr.front().first; ll y=arr.front().second; arr.pop(); for(ll i=0;i<4;i++){ ll a=x+dx[i]; ll b=y+dy[i]; if(a<1||b<1||a>n||b>n)continue; if(st[a][b])continue; if(way[a][b]==1)continue; st[a][b]=st[x][y]+1; if(a==x2&&b==y2)return st[a][b]; arr.push({a,b}); } } } int main(){ cin>>n; string a[n+1]; for(ll i=1;i<=n;i++)cin>>a[i]; for(ll i=1;i<=n;i++){ for(ll g=1;g<=n;g++)way[i][g]=a[i][g-1]-'0'; } cin>>x1>>y3>>x2>>y2; cout<<bfs(x1,y3,x2,y2); return 0; }
2.
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll n,m; const ll N=200; char way[N][N]; bool is[N][N]; ll dx[]={0,0,1,1,-1,-1,1,-1}; ll dy[]={1,-1,1,-1,1,-1,0,0}; void dfs(ll x,ll y){ for(int i=0;i<8;i++){ ll x1=x+dx[i]; ll y1=y+dy[i]; if(is[x1][y1])continue; if(x1<1||y1<1||x1>n||y1>m)continue; if(way[x1][y1]=='.')continue; is[x1][y1]=true; dfs(x1,y1); } } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int g=1;g<=m;g++)cin>>way[i][g]; } ll sum=0; for(int i=1;i<=n;i++){ for(int g=1;g<=m;g++){ if(way[i][g]=='W'&&!is[i][g]){ dfs(i,g); sum++; } } } cout<<sum; return 0; }
3.
#include <bits/stdc++.h> using namespace std; typedef long long ll; struct ele{ int floor; int s; }; ll n,a,b; const ll N=300; ll updown[N]; bool step[N]; int dfs(){ queue<ele> q; q.push({a,0}); step[a]=true; while(!q.empty()){ ele cur=q.front(); q.pop(); if(cur.floor==b){ return cur.s; } int up=cur.floor+updown[cur.floor]; int down=cur.floor-updown[cur.floor]; if(up<=n&&up>=1&&!step[up]){ q.push({up,cur.s+1}); step[up]=true; } if(down>=1&&down<=n&&!step[down]){ q.push({down,cur.s+1}); step[down]=true; } } return -1; } int main(){ cin>>n>>a>>b; for(int i=1;i<=n;i++)cin>>updown[i]; cout<<dfs(); return 0; }