HDU 1198 :Farm Irrigation
阿新 • • 發佈:2018-11-06
解題思路:(dfs思路)通過構圖,記錄每條路的通向方向(定義一個數組儲存各條路通向的方向),在去尋找下一個田地是否連通,並且一個一個尋找,並標記。
程式碼內詳細講解:
#include<iostream> #include<cstdio> #include<string.h> using namespace std; int f[4][2]={-1,0,1,0,0,-1,0,1};//上下左右 int map[11][4]={//地圖的分佈,上下左右,1代表通,0代表不通 ,按照A-K圖的順序打出下表 {1,0,1,0},{1,0,0,1}, {0,1,1,0},{0,1,0,1}, {1,1,0,0},{0,0,1,1}, {1,0,1,1},{1,1,1,0}, {0,1,1,1},{1,1,0,1}, {1,1,1,1}}; int m,n; int vis[55][55];//用來標記走過的路 char d[55][55]; void dfs(int x,int y) { vis[x][y]=1;//標記走過的 for(int i=0;i<4;i++) { int xx=x+f[i][0];//控制x軸座標 int yy=y+f[i][1];//控制y軸座標 int j; if(i==0||i==1)//根據移動的方向 提前確定下一塊田需要連線的方向 { j=(i+1)%2; } else if(i==2) { j=3; } else { j=2; } if(xx>=0 && yy>=0 && xx<n && yy<m && !vis[xx][yy] && map[d[x][y]-'A'][i]==1 && map[d[xx][yy]-'A'][j]==1) {//前4個條件判斷是否越界和是否走過;5:判斷當前位置是否通向(xx,yy); //6:判斷(xx,yy)是否有連線的路 dfs(xx,yy); } } } int main() { while(~scanf("%d %d",&n,&m)) { if(n==-1&&m==-1) { break; } getchar(); memset(vis,0,sizeof(vis)); int sum=0; for(int i=0;i<n;i++) { scanf("%s",d[i]); } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(!vis[i][j]) { sum++; dfs(i,j); } } } printf("%d\n",sum); } }