ural 1008 Image Encoding BFS
/* 题目:给出两种图形的像素表示方法,现在给出其中一种,求另一种的像素表示方法。 分析:BFS的思想 */ #include <iostream> #include <cstring> #include <cstdio> #include <queue> #include <vector> using namespace std; const int X = 15; struct node{ int x,y; }; int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};//右上左下的方向偏移量 char d[] = "RTLB"; bool use[X][X],map[X][X]; vector<int> ans[200]; int pos; bool check(int x,int y){ //判断是否符合 if(x<1||y<1||x>10||y>10) //越界 return false; if(!map[x][y]||use[x][y]) //若不为黑色或者已经访问过的 return false; return true; } void bfs(int sx,int sy){//给出黑色的位置,求字母的表示方法,上下左右的储存方式用向量vector来储存 memset(use,false,sizeof(use)); pos = 0; node cur,temp; cur.x = sx; cur.y = sy; queue<node> q; q.push(cur); use[sx][sy] = true; while(!q.empty()){ cur = q.front(); q.pop(); for(int i=0;i<4;i++){ temp.x = cur.x+dir[i][0]; temp.y = cur.y+dir[i][1]; if(check(temp.x,temp.y)){ q.push(temp); use[temp.x][temp.y] = true; ans[pos].push_back(i); } } pos++; } int len; cout<<sx<<" "<<sy<<endl; for(int i=0;i<pos;i++){ len = ans[i].size(); for(int j=0;j<len;j++) cout<<d[ans[i][j]]; if(i!=pos-1) cout<<","<<endl; else cout<<"."<<endl; } } void bfs_2(int sx,int sy){ //给出字母的表示方法,求坐标的表示方法 node cur,temp; queue<node> q; memset(map,false,sizeof(map)); cur.x = sx; cur.y = sy; q.push(cur); char s[10]; int len,cnt = 1; while(q.size()){ cur = q.front(); map[cur.x][cur.y] = true; q.pop(); scanf("%s",s); len = strlen(s); if(len==1) continue; cnt += len-1; for(int i=0;i<len-1;i++){ if(s[i]=='R'){ temp.x = cur.x+1; temp.y = cur.y; q.push(temp); } else if(s[i]=='T'){ temp.x = cur.x; temp.y = cur.y+1; q.push(temp); } else if(s[i]=='L'){ temp.x = cur.x-1; temp.y = cur.y; q.push(temp); } else{ temp.x = cur.x; temp.y = cur.y-1; q.push(temp); } } } cout<<cnt<<endl; for(int i=0;i<X;i++) //先按x的由小到大输出,若相同再按y的由小到大输出 for(int j=0;j<X;j++) if(map[i][j]) cout<<i<<" "<<j<<endl; } void input(){ //输入函数 int x,y,z; cin>>x; if(getchar()=='\n'){ //如果第一行只有一个数字输入,表示输入的是用坐标的方式来表示像素 int sx = 10000,sy; memset(map,false,sizeof(map)); for(int i=0;i<x;i++){ scanf("%d%d",&y,&z); map[y][z] = true; if(y<sx){ sx = y; sy = z; } } bfs(sx,sy); } else{ scanf("%d",&y); bfs_2(x,y); } } int main(){ freopen("sum.in","r",stdin); freopen("sum.out","w",stdout); input(); return 0; }