解法一:
深度优先搜索。搜索第一行和最后一行
搜索第一列和最后一列
标记搜索过的点。
没有搜索到的点就是被包围了
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int a[31][31];
int n;
int mark[31][31];
int dx[]={0, -1, 0, 1};
int dy[]={-1, 0, 1, 0};
void dfs(int x, int y)
{
if(mark[x][y])
return ;
mark[x][y] = 1;
for(int i = 0; i < 4; i++)
{
int x0 = x + dx[i];
int y0 = y + dy[i];
if( x0 >=1 && x0<=n && y0>=1 && y0<=n && !mark[x0][y0])
{
dfs(x0, y0);
}
}
}
int main()
{
cin>>n;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
cin>>a[i][j];
if(a[i][j])
{
mark[i][j] = 1;
}
}
}
//从行与列来进行搜索
for(int i = 1; i <=n; i++)
{
if(!mark[1][i])//搜索一行
dfs(1, i);
if(!mark[n][i])//第N行
dfs(n, i);
if(!mark[i][1])//第一列
dfs(i, 1);
if(!mark[i][n])//第n列
dfs(i, n);
}
for(int i = 1; i <= n ; i++)
{
for(int j = 1; j <= n; j++)
{
if(!mark[i][j])
cout<<2<<" ";
else
cout<<a[i][j]<<" ";
}
cout<<endl;
}
//system("pause");
}
解法二:广度优先搜索
找到第一个1,其右下角就是0了,就是包围的0
从这个0开始广度优先搜索染色
#include <iostream>
#include <cstring>
#include <cstdio>
#include<queue>
using namespace std;
struct node
{
int x, y;
};
queue<node>Q;
int a[31][31];
int n;
int mark[31][31];
int dx[]={0, -1, 0, 1};
int dy[]={-1, 0, 1, 0};
void bfs(int x, int y)
{
mark[x][y] = 2;
node tnode;
node tempnode;
tnode.x = x;
tnode.y = y;
Q.push(tnode);
while(!Q.empty())
{
tempnode = Q.front();
Q.pop();
for(int i = 0; i < 4; i++)
{
int x0 = tempnode.x + dx[i];
int y0 = tempnode.y +dy[i];
if(x0>=1 && x0<=n && y0>=1&&y0<=n && !mark[x0][y0] && a[x0][y0] != 1)
{
mark[x0][y0] = 2;
tnode.x = x0;
tnode.y = y0;
Q.push(tnode);
}
}
}
}
int main()
{
cin>>n;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
cin>>a[i][j];
}
}
int x,y;
int tag = false;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(a[i][j])
{
x = i+1;
y = j+1;
tag = true;
break;
}
}
if(tag)
break;
}
//cout<<x<<" "<<y;
//system("pause");
bfs(x, y);
//cout<<endl;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(mark[i][j] == 2)
cout<<2<<" ";
else
cout<<a[i][j]<<" ";
}
cout<<endl;
}
// system("pause");
}