标签:icpc acm acm-icpc 贪心 iostream
2 2 2 11 11 3 3 001 111 101
111 101
#include <iostream> #include <stdlib.h> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int maxx = 1000 + 10; int n, m; char str[maxx][maxx]; char ans[maxx*maxx]; char ans_str[maxx*maxx]; bool vis[maxx][maxx]; int kjudge; int dir1[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; struct node1{ int x; int y; bool operator < (const node1 & a)const{ return a.x+a.y > x+y; } }; priority_queue<node1> pp1; queue<node1> p1; int dir2[2][2] = {{1,0},{0,1}}; struct node2{ int x; int y; int num; int id; bool operator < (const node2& a) const { if(a.num == num) return a.id < id; return a.num < num; } }; priority_queue<node2> pp2; queue<node2> p2; bool ok(int x,int y){ if(x<0||x>=n) return false; if(y<0||y>=m) return false; return true; } bool ok1(int x,int y){ if(ok(x,y)&&str[x][y] == '0'){ return true; } return false; } bool ok2(int x,int y){ if(ok(x,y)&&vis[x][y] == false){ return true; } return false; } void output(int len){ int i = 0; if(ans_str[0] == '9') i++; for(; i < len; ++i){ printf("%c",ans_str[i]); } printf("\n"); } int bfs2(int x,int y){ node2 k; if(str[n-1][m-1] == '9'){ printf("0\n"); return -1; } if(x == n-1 &&y == m-1){ printf("%c\n",str[n-1][m-1]); return -1; } memset(vis,false,sizeof(vis)); memset(ans,'_',sizeof(ans)); k.x = x; k.y = y; k.num = 1; ans[0] = str[k.x][k.y]; k.id = str[k.x][k.y] - '0'; vis[x][y] = true; pp2.push(k); int now = k.num; int judge = k.id; while(!pp2.empty()){ node2 q = pp2.top(); pp2.pop(); if(now != q.num){ now = q.num; judge = q.id; } if(judge == q.id){ for(int i = 0;i < 2; ++i){ int dx = dir2[i][0]+q.x; int dy = dir2[i][1]+q.y; if(dx == n-1 && dy == m-1){ ans[q.num] = str[dx][dy]; if(!kjudge){ for(int j = 0;j <= q.num; ++j){ ans_str[j] = ans[j]; } }else{ int mj = 0; for(int j = 0;j <= q.num; ++j){ if(ans_str[j] > ans[j]){ mj = 1; break; } } if(mj){ for(int j = 0;j <= q.num; ++j){ ans_str[j] = ans[j]; } } } while(!pp2.empty()) pp2.pop(); return q.num+1; } if(ok2(dx,dy)){ if(ans[q.num] == '_')ans[q.num] = str[dx][dy]; else ans[q.num] = min(ans[q.num],str[dx][dy]); vis[dx][dy] = true; node2 temp; temp.id = str[dx][dy] - '0'; temp.x = dx; temp.y = dy; temp.num = q.num+1; pp2.push(temp); } } } } } void bfs1(){ ///找起点位置 node1 k; k.x = 0; k.y = 0; kjudge = 0; int klen = -1; if(str[0][0] == '0') { p1.push(k); str[0][0] = '9'; while(!p1.empty()){ node1 q = p1.front(); pp1.push(q); p1.pop(); for(int i = 0;i < 4; ++i){ int dx = dir1[i][0] + q.x; int dy = dir1[i][1] + q.y; if(ok1(dx,dy)){ node1 temp; temp.x = dx; temp.y = dy; str[dx][dy] = '9'; p1.push(temp); } } } int judge = pp1.top().x + pp1.top().y; while(!pp1.empty()){ node1 temp = pp1.top(); if(judge == temp.x+temp.y){ klen = bfs2(temp.x,temp.y); } pp1.pop(); } }else{ klen = bfs2(0,0); } if(klen != -1)output(klen); } int main(){ int T; cin>>T; while(T--){ scanf("%d%d",&n,&m); for(int i = 0;i < n; ++i){ scanf("%s",str[i]); } bfs1(); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:icpc acm acm-icpc 贪心 iostream
原文地址:http://blog.csdn.net/u012844301/article/details/47186949