CodeForces - 1316D Nash Matrix(构造+dfs)
題目鏈接:點擊查看
題目大意:給出一個 n * n 的矩陣,初始時每個格子都為空,現在要求我們自己用 ' R ' , ' L ' , ' U ' , ' D ' 和 ' X ' 填充,分別表示在每個格子必須完成的指令,前四個分別為方向指令,代表著需要向指定的方向移動一個單位,而 ' X ' 代表終點,在這個點必須停下來,而在移動的過程中,不許越界,問能否找到一種構造方案,使得每個格子最終都能到達指定的格子,-1 -1 代表無限循環
題目分析:其實光考慮格子的屬性,我們可以分為三種,一種是無限循環的,一種是終點,還有一種就是正常的路了,對于無限循環,第一反應應該是找到一個環,但后來反應過來了,我們只需要找到找到相鄰的兩個無限循環的格子,讓其對起來這兩個格子就形成一個最小的環了,與這兩個格子直接相連的所有無限循環,都可以沿著路徑到達這兩個格子,這就是我處理無限循環的方法,剩下的就是關于 ‘ X ’ ,因為 ' X ' 可以視為終點,各個其他的點匯集而來的點,我們只需要從這個點出發,將沿路需要到達該點的所有點都連接過來就好了,經過上述兩個操作后,矩陣中的所有點應該都有了一個確定的賦值,此時檢查一遍,如果仍然有空缺,那就說明無解了,否則該矩陣就是答案了
比較簡單的一道構造題,我感覺dfs寫起來比bfs要簡單不少,因為每個點至多遍歷一遍,所以時間復雜度為O(n*n)
代碼:
#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e3+100;const int b[4][2]={0,1,0,-1,1,0,-1,0};const char pos[4]={'L','R','U','D'};int n;struct Node {int x,y;char ch; }point[N][N];void dfs1(int x,int y)//處理無限循環 {for(int i=0;i<4;i++){int xx=x+b[i][0];int yy=y+b[i][1];if(xx<=0||yy<=0||xx>n||yy>n)continue;if(point[xx][yy].ch!='T')continue;point[xx][yy].ch=pos[i];dfs1(xx,yy);} }void dfs2(int x,int y,int sx,int sy)//處理正常的路 {for(int i=0;i<4;i++){int xx=x+b[i][0];int yy=y+b[i][1];if(xx<=0||yy<=0||xx>n||yy>n)continue;if(point[xx][yy].ch!='C')continue;if(point[xx][yy].x==sx&&point[xx][yy].y==sy){point[xx][yy].ch=pos[i];dfs2(xx,yy,sx,sy);}} }bool check() {for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(point[i][j].ch=='T'||point[i][j].ch=='C')return false;return true; }int main() { #ifndef ONLINE_JUDGE // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // ios::sync_with_stdio(false);scanf("%d",&n);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){scanf("%d%d",&point[i][j].x,&point[i][j].y);if(point[i][j].x==i&&point[i][j].y==j)//終點point[i][j].ch='X';else if(point[i][j].x==-1&&point[i][j].y==-1)//無限循環point[i][j].ch='T';else//正常的路point[i][j].ch='C';}for(int x=1;x<=n;x++)//處理無限循環 for(int y=1;y<=n;y++)if(point[x][y].ch=='T')for(int k=0;k<4;k++){int xx=x+b[k][0];int yy=y+b[k][1];if(xx<=0||yy<=0||xx>n||yy>n)continue;if(point[xx][yy].ch=='T'){point[x][y].ch=pos[k^1];point[xx][yy].ch=pos[k];dfs1(x,y);dfs1(xx,yy);}}for(int x=1;x<=n;x++)//處理制定路徑for(int y=1;y<=n;y++)if(point[x][y].ch=='X')dfs2(x,y,x,y);if(!check())puts("INVALID");else{puts("VALID");for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)putchar(point[i][j].ch);putchar('\n');}}return 0; }?
總結
以上是生活随笔為你收集整理的CodeForces - 1316D Nash Matrix(构造+dfs)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 1316C P
- 下一篇: CodeForces - 1316E T