由斜杠划分区域

问题描述 :
在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。
(请注意,反斜杠字符是转义的,因此输入的字符串中是 \,在代码中函数调用时传递的实参用 “\” 表示一个""。)。
返回区域的数目。

示例 1:
输入:
[
" /",
"/ "
]
输出:2
解释:2x2 网格如下:在这里插入图片描述

示例 2:
输入:
[
" /",
" "
]
输出:1
解释:2x2 网格如下:
在这里插入图片描述

示例 3:
输入:
[
“/”,
“/”
]
输出:4
解释:(回想一下,因为 \ 字符是转义的,所以 “\/” 表示 /,而 “/\” 表示 /\。)

2x2 网格如下:
在这里插入图片描述

示例 4:
输入:
[
“/”,
“/”
]
输出:5
解释:(回想一下,因为 \ 字符是转义的,所以 “/\” 表示 /\,而 “\/” 表示 /。)
2x2 网格如下:
在这里插入图片描述

示例 5:
输入:
[
“//”,
"/ "
]
输出:3
解释:2x2 网格如下:
在这里插入图片描述

可使用如下main函数:

int main(){
    int n;
    vector<string> grid;
    string line;
    cin>>n;
    cin.get();
    for(int i=0; i<n; i++){
        getline(cin,line);
        grid.push_back(line);
    }
    int res=regionsBySlashes(grid) ;
    cout<<res;
}

输入说明 :
首先输入网格的大小N,1 <= N <= 30
然后输入N行,每行N个字符,每个字符是 ‘/’、’’、或 ’ '。

输出说明 :
输出结果

输入范例 :
2
/
/

输出范例 :
5

//用3*3的大网格代替每一个1*1的小网格
void dfs(int x,int y,vector<vector<bool>> &vis,vector<vector<int>> &new_grid){
	if(x<0||x>=new_grid.size()||y<0||y>=new_grid[0].size()||new_grid[x][y]==1||vis[x][y]==true){
		return ;
	}
	vis[x][y]=true;
	dfs(x+1,y,vis,new_grid);
	dfs(x,y+1,vis,new_grid);
	dfs(x-1,y,vis,new_grid);
	dfs(x,y-1,vis,new_grid);
}
int regionsBySlashes(vector<string> &grid){
	int n=grid.size();
	vector<vector<bool>> vis(3*n,vector<bool> (3*n,false));
	vector<vector<int>> new_grid(3*n,vector<int>(3*n,0));
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(grid[i][j]=='/'){
				new_grid[3*i][3*j+2] = 1;
                new_grid[3*i+1][3*j+1] = 1;
                new_grid[3*i+2][3*j] = 1;
			}else if(grid[i][j]=='\\'){
				new_grid[3*i][3*j] = 1;
                new_grid[3*i+1][3*j+1] = 1;
                new_grid[3*i+2][3*j+2] = 1;
			}
		}
	}
	int count=0;
	for(int i=0;i<3*n;i++){
		for(int j=0;j<3*n;j++){
			if(!vis[i][j]&&new_grid[i][j]==0){
				dfs(i,j,vis,new_grid);
				count++;
			}
		}
	}
	return count; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值