- #include <bits/stdc++.h>
- using namespace std;
- string grid[12];
- bool vis[12][12];
- int dis[12][12];
- int dx[] = {0, 0, +1, -1};
- int dy[] = {+1, -1, 0, 0};
- int n;
- bool valid(int x, int y, char ch){
- if(x<0 || x == n || y<0||y == n || grid[x][y] == '#') return false;
- else if(grid[x][y]>= 'A'&& grid[x][y]<= 'Z' && grid[x][y] > ch+1) return false;
- return true;
- }
- int bfs(char ch, int x, int y){
- list< pair<int, int> >q;
- q.push_back(make_pair(x, y));
- vis[x][y]= true;
- dis[x][y] = 0;
- while(!q.empty()){
- int fromx = q.front().first;
- int fromy = q.front().second;
- vis[fromx][fromy] = true;
- q.pop_front();
- for(int i = 0; i < 4; i++){
- int tox = fromx + dx[i];
- int toy = fromy + dy[i];
- if(!valid(tox, toy, ch)) continue;
- if(vis[tox][toy]) continue;
- vis[tox][toy] = true;
- q.push_back(make_pair(tox, toy));
- dis[tox][toy] = dis[fromx][fromy] + 1;
- if(grid[tox][toy] == ch+1) return dis[tox][toy];
- }
- }
- return -1;
- }
- int main(){
- int ts;
- scanf("%d", &ts);
- for(int p = 1; p <= ts; p++){
- memset(vis, false, sizeof(vis));
- memset(dis, false, sizeof(dis));
- scanf("%d", &n);
- int co = 0;
- pair<int,int> positions[26];
- for(int i = 0; i <n; i++){
- //scanf("%s", grid[i]);
- cin>>grid[i];
- for(int j = 0; j <grid[i].size(); j++){
- if(grid[i][j]>= 'A' && grid[i][j]<= 'Z'){
- positions[grid[i][j]-'A'].first = i;
- positions[grid[i][j]-'A'].second = j;
- co++;
- }
- }
- }
- int sum = 0;
- for(int i = 0; i <co-1; i++){
- int val = bfs('A'+i, positions[i].first, positions[i].second);
- if(val == -1) {
- sum = -1;
- break;
- }
- sum+= val;
- memset(vis, false, sizeof(vis));
- memset(dis, false, sizeof(dis));
- }
- if(sum == -1) printf("Case %d: Impossible\n", p);
- else printf("Case %d: %d\n",p, sum);
- }
- return 0;
- }
Showing posts with label BFS and DFS. Show all posts
Showing posts with label BFS and DFS. Show all posts
Saturday, 29 July 2017
Lightoj 1066 - Gathering Food
Lightoj 1197 - Help Hanzo
- #include <bits/stdc++.h>
- using namespace std;
- #define maxx 100005
- bitset<maxx>vis;
- vector<int>prime;
- void sieve()
- {
- int x=maxx/2, y=sqrt(maxx)/2;
- for(int i=1;i<=y;i++)
- {
- if(vis[i])
- {
- for(int j=(i*(i+1))*2;j<=x;j+=(2*i)+1)
- vis[j]=1;
- }
- }
- prime.pb(2);
- for(int i=3;i<maxx;i+=2)
- if(vis[i/2]==0)
- prime.pb(i);
- }
- int segmented_sieve(int a, int b){
- vis=0;
- if(b<2) return 0;
- if(a<2) a=2;
- int xx=sqrt((double)b)+1;
- for(ll i=0;i<SZ(prime) && prime[i]<=xx;i++){
- ll j=(a/prime[i])*prime[i];
- if(j <a) j+=prime[i];
- if(j<(ll)(prime[i]+prime[i])) j=prime[i]+prime[i];
- for(;j<=b;j+=prime[i])
- vis[j-a]=1;
- }
- int cnt=0;
- for(ll i=a;i<=b;i++)
- if(vis[i-a]==0) cnt++;
- return cnt;
- }
- int main()
- {
- ///freopen("in.txt","r",stdin);
- ///freopen("out.txt","w",stdout);
- sieve();
- int t;
- sf(t);
- TEST_CASE(t)
- {
- ll a,b;
- sffl(a,b);
- PRINT_CASE;
- printf("%d\n",segmented_sieve(a,b));
- }
- return 0;
- }
Lightoj 1175 - Jane and the Frost Giants
- #include <bits/stdc++.h>
- using namespace std;
- const int fx[]={+1,-1,+0,+0};
- const int fy[]={+0,+0,+1,-1};
- char graph[201][201];
- int dj[201][201];
- int df[201][201];
- bool visit[201][201];
- int r,c;
- vector<pii>fdata;
- pii pointj;
- bool testf(pii tmp)
- {
- if(tmp.ff<0 || tmp.ff>=r || tmp.ss<0 || tmp.ss>=c || visit[tmp.ff][tmp.ss] || graph[tmp.ff][tmp.ss]!='.')
- return 0;
- return 1;
- }
- bool testj(pii tmp)
- {
- if(tmp.ff<0 || tmp.ff>=r || tmp.ss<0 || tmp.ss>=c || visit[tmp.ff][tmp.ss] || graph[tmp.ff][tmp.ss]!='.')
- return 0;
- return 1;
- }
- void bfsf()
- {
- loop(i,r+1) loop(j,c+1)
- {visit[i][j]=0;df[i][j]=inf;}
- queue<pii>Q;
- pii u,v;
- for(int i=0;i<SZ(fdata);i++)
- {
- u=fdata[i];
- df[u.ff][u.ss]=0;
- Q.push(u);
- visit[u.ff][u.ss]=1;
- }
- while(!Q.empty())
- {
- u=Q.front();
- Q.pop();
- loop(i,4)
- {
- v.ff=u.ff+fx[i];
- v.ss=u.ss+fy[i];
- if(testf(v))
- {
- visit[v.ff][v.ss]=1;
- df[v.ff][v.ss]=df[u.ff][u.ss]+1;
- Q.push(v);
- }
- }
- }
- }
- int bfsj(pii src)
- {
- loop(i,r+1) loop(j,c+1)
- {
- visit[i][j]=0;
- dj[i][j]=inf;
- }
- visit[src.ff][src.ss]=1;
- pii u,v;
- dj[src.ff][src.ss]=0;
- queue<pii>Q;
- Q.push(src);
- while(!Q.empty())
- {
- u=Q.front();
- Q.pop();
- if(u.ff==0 || u.ff==r-1 || u.ss==0 || u.ss==c-1)
- return dj[u.ff][u.ss];
- loop(i,4)
- {
- v.ff=u.ff+fx[i];
- v.ss=u.ss+fy[i];
- if(testj(v) && (df[v.ff][v.ss] > dj[u.ff][u.ss]+1))
- {
- visit[v.ff][v.ss]=1;
- dj[v.ff][v.ss]=dj[u.ff][u.ss]+1;
- Q.push(v);
- }
- }
- }
- return -1;
- }
- int main()
- {
- ///freopen("in.txt","r",stdin);
- ///freopen("out.txt","w",stdout);
- int t;
- sf(t);
- TEST_CASE(t)
- {
- sff(r,c);
- loop(i,r) loop(j,c)
- {
- cin>>graph[i][j];
- if(graph[i][j]=='J')
- pointj.ff=i,pointj.ss=j;
- else if(graph[i][j]=='F')
- fdata.pb(MP(i,j));
- }
- bfsf();
- int ans=bfsj(pointj);
- PRINT_CASE;
- if(ans==-1)
- pf("IMPOSSIBLE\n");
- else
- pf("%d\n",ans+1);
- fdata.clear();
- }
- return 0;
- }
Subscribe to:
Posts (Atom)
Most Featured Post
Lightoj 1159 - Batman
http://lightoj.com/volume_showproblem.php?problem=1159 problem analysis: First i thought of this as if s1, s2 and s3 are those three str...
-
Problem link: Problem Analysis: It is actually a basic Bisection problem , as we can see here we can not actually find a formula fo...
-
http://lightoj.com/volume_showproblem.php?problem=1032 #include <bits/stdc++.h> using namespace std ; #define ll long lo...