填涂颜色
题目描述
由数字 00 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 11 构成,围圈时只走上下左右 44 个方向。现要求把闭合圈内的所有空间都填写成 22。例如:6\times 66×6 的方阵(n=6n=6),涂色前和涂色后的方阵如下:
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1
输入格式
每组测试数据第一行一个整数 n(1 \le n \le 30)n(1≤n≤30)。
接下来 nn 行,由 00 和 11 组成的 n \times nn×n 的方阵。
方阵内只有一个闭合圈,圈内至少有一个 00。
//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)
输出格式
已经填好数字 22 的完整方阵。
输入输出样例
输入 #1复制
6 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1
输出 #1复制
0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 2 2 1 1 1 2 2 2 1 1 2 2 2 2 1 1 1 1 1 1 1
说明/提示
对于 100\%100% 的数据,1 \le n \le 301≤n≤30。
做题思路:这题运用的是dfs就可以做出来。首先将矩阵输出在1-n的空间上,因为未被包围的0可能并不互相联通,故可以从0-n+1的空间使用深搜,就可全部搜索到不变的0并标记,输出时将未标记到的0输出成2即可
具体代码:
#include<stdio.h>
int a[35][35]={0},b[35][35]={0};
int n;
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
void bfs(int x,int y){
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=0&&nx<=n+1&&ny>=0&&ny<=n+1&&b[nx][ny]==0&&a[nx][ny]==0){
b[nx][ny]=1;
bfs(nx,ny);
}
}
}}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
int x=0,y=0;
bfs(x,y);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]==0&&b[i][j]==1)printf("0 ");
else if(a[i][j]==1)printf("1 ");
else printf("2 ");
}printf("\n");
}
}
迷宫
题目描述
给定一个 N \times MN×M 方格的迷宫,迷宫里有 TT 处障碍,障碍处不可通过。
在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。
输入格式
第一行为三个正整数 N,M,TN,M,T,分别表示迷宫的长宽和障碍总数。
第二行为四个正整数 SX,SY,FX,FYSX,SY,FX,FY,SX,SYSX,SY 代表起点坐标,FX,FYFX,FY 代表终点坐标。
接下来 TT 行,每行两个正整数,表示障碍点的坐标。
输出格式
输出从起点坐标到终点坐标的方案总数。
输入输出样例
输入 #1复制
2 2 1 1 1 2 2 1 2
输出 #1复制
1
说明/提示
对于 100\%100% 的数据,1 \le N,M \le 51≤N,M≤5,1 \le T \le 101≤T≤10,1 \le SX,FX \le n1≤SX,FX≤n,1 \le SY,FY \le m1≤SY,FY≤m。
做题思路:一道很普通的深搜题,建立一个数组,用来标记走过的路径,注意在要使用dfs前先将起点标记,每次对下一步所走位置判断是否终点,成功就返回,并将前一步的标记去除继续搜索,每次找到终点次数加一,这样结果就出来了
代码如下:
#include<stdio.h>
int N,M,T;
int c,f;
int SX,SY,FX,FY,x,y;
int ans=0;
int b[10][10]={0};
int dx[4]={0,0,-1,1},dy[4]={-1,1,0,0};
void bfs(int x,int y)
{
if(x==FX&&y==FY){ans++;return ;}
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(b[nx][ny]==1){
b[nx][ny]=0;
bfs(nx,ny);
b[nx][ny]=1;
}
}
}
int main()
{
scanf("%d %d %d",&N,&M,&T);
scanf("%d %d %d %d",&SX,&SY,&FX,&FY);
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++){
b[i][j]=1;
}
}for(int i=0;i<T;i++){
scanf("%d %d",&c,&f);
b[c][f]=0;}
x=SX;y=SY;
b[x][y]=0;
bfs(x,y);
printf("%d",ans);
}