uvalive5992(搜索)
生活随笔
收集整理的這篇文章主要介紹了
uvalive5992(搜索)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
給出一個n*m的圖,‘.’可以走,‘#’不能走,圖中有字母‘a’~‘z’,每個時間每個字母會向四聯通的四個格子擴散,如果兩個字母相遇,那個格子會變成‘*’,問最后的圖長什么樣。
思路:
從每個字母開始搜,記錄一下就好了。
代碼:
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<string> #include<map> #include<iostream> #include<algorithm> #include<sstream> #include<climits> #include<queue>using namespace std;int n,m; char maze[505][505]; int vis[505][505]; int a[]= {1,-1,0,0}; int b[]= {0,0,1,-1};struct Point {int x,y,r;char ans;Point(int xx,int yy,char anss,int rr){x=xx;y=yy;ans=anss;r=rr;} };void bfs() {queue<Point> q;for(int i=1; i<=n; i++)for(int j=1; j<=m; j++)if(maze[i][j] >= 'a' && maze[i][j] <= 'z')q.push(Point(i,j,maze[i][j],0));while(!q.empty()){Point t = q.front();q.pop();int x = t.x;int y = t.y;int r = t.r;char ans = t.ans;if(maze[x][y] == '*') continue;for(int i=0; i<4; i++){if(x + a[i] <= n && x + a[i] >= 1 && y + b[i] >= 1 && y + b[i] <= m){if(maze[x + a[i]][y + b[i]] == '.'){vis[x + a[i]][y + b[i]] = r + 1;maze[x + a[i]][y + b[i]] = ans;q.push(Point(x + a[i],y + b[i],ans,r+1));}else{if(maze[x + a[i]][y + b[i]] >= 'a' || maze[x + a[i]][y + b[i]] <= 'z'){if(vis[x + a[i]][y + b[i]] ){if(vis[x + a[i]][y + b[i]] == r + 1 && ans != maze[x + a[i]][y + b[i]]){maze[x + a[i]][y + b[i]] = '*';}}}}}}} }int main() {int t;cin>>t;while(t--){scanf("%d%d",&n,&m);for(int i=1; i<=n; i++)scanf("%s",maze[i] + 1);memset(vis,0,sizeof(vis));bfs();for(int i=1; i<=n; i++)printf("%s\n",maze[i]+1);cout<<endl;}return 0; }總結
以上是生活随笔為你收集整理的uvalive5992(搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uvalive5990(坑点蛮多的一道题
- 下一篇: uvalive4835(模拟)