题解
2024-09-28 14:20:59
发布于:广东
60阅读
0回复
0点赞
作者用心了,第二幅图确实是一整局围棋下完的样子
这道题深搜广搜都可以,掌握好思路就行
#include <iostream>
#include <vector>
#include <memory.h>
using namespace std;
int n;
char mp[1005][1005];
bool vis[1005][1005];
int a[1005][1005];
int dir[4][2] = {-1, 0, 0, -1, 0, 1, 1, 0};
bool check(int x, int y, char c){
if(x < 1 || x > n || y < 1 || y > n) return 0;//超出范围要扣税
if(vis[x][y] || mp[x][y] != c && mp[x][y] != '.') return 0;//便利过了或者不是同色棋子要扣税
return 1;
}
int dfs(int x, int y, char c){//第一个深搜确定该区域棋子气数
int ct = 0;
vis[x][y] = 1;
for(int i = 0; i < 4; i++){
int xx = x + dir[i][0], yy = y + dir[i][1];
if(check(xx, yy, c)){
if(mp[xx][yy] == '.'){//周围是.就说明有气
vis[xx][yy] = 1;//标个vis防止重复加
ct++;
}
else ct += dfs(xx, yy, c);//否则就是同色棋子加上该棋子的气
}
}
return ct;
}int dfs2(int x, int y, int val){//第二个深搜是把气数传给这个区域所有棋子,同时清空vis
a[x][y] = val;//给这个棋子标上气数
for(int i = 0; i < 4; i++){
int xx = x + dir[i][0], yy = y + dir[i][1];
if(xx >= 1 && xx <= n && yy >= 1 && yy <= n){
if(vis[xx][yy]){//如果有vis就说明这个地方为.或同色棋子
vis[xx][yy] = 0;//清空vis
if(mp[xx][yy] != '.') dfs2(xx, yy, val);//不是同色棋子就继续传下去
}
}
}
}
int main(){
cin >> n;
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
cin >> mp[i][j];
}
}
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
if (mp[i][j] != '.' && !a[i][j]){//如果没有遍历到
int val = dfs(i, j, mp[i][j]);//开搜!
vis[i][j] = 0;
dfs2(i, j, val);
}
}
}for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
printf("%d ", a[i][j]);
}printf("\n");
}
return 0;
}
由于搜过的棋子以后都不会再搜,所以时间复杂度为
这里空空如也
有帮助,赞一个