- 再解炸弹人
输入格式:
第一行4个整数为n m x y,分别n和m表示迷宫的行和列,x和y表示小人的起始坐标(从0行0列开始计算),接下来的n行m列为地图。
1<=n,m<=50
输出格式:
最多可以消灭的敌人数。
BFS《一层一层
https://bbs.codeaha.com/problem-12034.html
字符数组的读入又又又忘了都是从0开始的,WAWAWA
#include<stdio.h>
char a[55][55];
int book[55][55],m,n;
struct note{
int x;
int y;
}que[2501];
int get(int x,int y){
int i,j,sum=0;
i=x;
while(i>=0){
if(a[i][y]=='#') break;
if(a[i][y]=='G') sum++;
i--;
}
i=x;
while(i<m){
if(a[i][y]=='#') break;
if(a[i][y]=='G') sum++;
i++;
}
j=y;
while(j<n){
if(a[x][j]=='#') break;
if(a[x][j]=='G') sum++;
j++;
}
j=y;
while(j>=0){
if(a[x][j]=='#') break;
if(a[x][j]=='G') sum++;
j--;
}
return sum;
}
int main(){
int sx,sy,head,tail,tx,ty;
int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
scanf("%d%d%d%d",&m,&n,&sx,&sy);
int i;
for(i=0;i<m;i++){
scanf("%s",a[i]);
}
head=tail=0;
book[sx][sy]=1;
que[tail].x=sx;
que[tail].y=sy;
tail++;
int max=get(sx,sy);
while(head<tail){
for(i=0;i<4;i++){
tx=que[head].x +next[i][0];
ty=que[head].y +next[i][1];
if(tx<0||tx>m-1||ty<0||ty>n-1) continue;
if(book[tx][ty]==0&&a[tx][ty]=='.'){
max=max>get(tx,ty)?max:get(tx,ty);
book[tx][ty]=1;
que[tail].x =tx;
que[tail].y =ty;
tail++;
}
}
head++;
}
printf("%d",max);
return 0;
}
2.举出1-N的位每位不同的数
BFS*《不撞南墙不回头*
#include<stdio.h>
int a[10],book[10],n;//C语言全局变量为0 ,无需赋值
void dfs(int step){//step 表示现在在第几位
int i;
if(step==n+1) {
for(i=1;i<=n;i++){
printf("%d ",a[i]);
}
printf("\n");
return ;//返回最近一次调用 函数的位置
}
for(i=1;i<=n;i++){
if(book[i]==0){
book[i]=1;//book标记为已经用过了
a[step]=i;//将I放到第step位
dfs(step+1);//自己调用自己
book[i]=0; //**** 表示该数字又可用
}
}
return ;
}
int main(){
scanf("%d",&n);
dfs(1);//首先在第一位上
return 0;
}
3.XXX+XXX=XXX《每位都不同
DFS
#include<stdio.h>
int a[10],book[10];
void dfs(int step){
int i;
if(step==10){
if(a[1]*100+a[4]*100+a[2]*10+a[5]*10+a[3]+a[6]==a[7]*100+a[8]*10+a[9]){
printf("%d%d%d +%d%d%d=%d%d%d",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
printf("\n");
}
return ;
}
for(i=1;i<10;i++){
if(book[i]==0){
book[i]=1;
a[step]=i;
dfs(step+1);
book[i]=0;
}
}
return ;
}
int main(){
dfs(1);
return 0;
}
迷宫问题(SX,SY)————》(P,Q)
DFS
#include<stdio.h>
int a[51][51],book[51][51],m,n,p,q,min=999999;
void dfs(int x,int y,int step){
int tx,ty,i;
if(x==p&&y==q){
if(step<min) min=step;
return ;
}
int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
for(i=0;i<4;i++){
tx=x+next[i][0];
ty=y+next[i][1];
if(tx<1||tx>m||ty<1||ty>n) continue;
if(book[tx][ty]==0&&a[tx][ty]==0){
book[tx][ty]=1;
dfs(tx,ty,step+1);
book[tx][ty]=0;
}
}
return ;
}
int main(){
int sx,sy;
scanf("%d%d",&m,&n);
int i,j;
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
scanf("%d%d%d%d",&sx,&sy,&p,&q);
dfs(sx,sy,0);
printf("%d",min);
return 0;
}
BFS
#include<stdio.h>
int a[101][101],book[101][101];
struct note {
int x;
int y;
int f;
int s;
};
int main(){
struct note que[10001];//50*50的可能性
int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int sx,sy,tx,ty,m,n,p,q,i,j,tail,head,flag=0;
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
scanf("%d%d%d%d",&sx,&sy,&p,&q);
tail=head=0;
book[sx][sy]=0;
que[tail].x=sx;
que[tail].y =sy;
que[tail].s =0;
que[tail].f=0;
tail++;
while(head<tail){
for(i=0;i<4;i++){
tx=que[head].x +next[i][0];
ty=que[head].y+next[i][1];
if(tx<1||tx>m||ty<1||ty>n) continue;
if(book[tx][ty]==0&&a[tx][ty]==0){
book[tx][ty]=1;
que[tail].x =tx;
que[tail].y =ty;
que[tail].s =que[head].s +1;
que[tail].f =head;//存放路径
tail++;
}
if(tx==p&&ty==q) {
flag=1;
break;
}
}
if(flag) break;
head++;//对下一个点进行拓展
}
if(flag!=1) printf("No Way!") ;
else
printf("%d",que[tail-1].s );
return 0;
}
6.BFS
宝岛探险
BFS————
#include<stdio.h>
int a[101][101],book[101][101],m,n;
struct note{
int x;
int y;
}que[10001];
int main(){
int sx,sy,tx,ty,head,tail,i,j,s=1;
int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
scanf("%d%d%d%d",&m,&n,&sx,&sy);
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
head=tail=0;
que[tail].x =sx;
que[tail].y =sy;
tail++;
book[sx][sy]=1;
while(head<tail){
for(i=0;i<4;i++){
tx=que[head].x +next[i][0];
ty=que[head].y +next[i][1];
if(tx<1||tx>m||ty<1||ty>n){
continue;
}
if(book[tx][ty]==0&&a[tx][ty]>0) {
book[tx][ty]=1;
s++;
que[tail].x =tx;
que[tail].y =ty;
tail++;
}
}
head++;
}
printf("%d",s);
return 0;
}
DFS——————
#include<stdio.h>
int a[101][101],book[101][101],m,n,s;
void dfs(int x,int y){
int tx,ty,i;
int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
for(i=0;i<4;i++){
tx=x+next[i][0];
ty=y+next[i][1];
if(tx<1||tx>m||ty<1||ty>n) continue;
if(book[tx][ty]==0&&a[tx][ty]>0){
book[tx][ty]=1;
s++;
dfs(tx,ty);
}
}
return ;
}
int main(){
int sx,sy,i,j;
scanf("%d%d%d%d",&m,&n,&sx,&sy);
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
book[sx][sy]=1;
dfs(sx,sy);
printf("%d",s+1);
return 0;
}
着色法DFS
通过循环%3d 打出不同的岛的置不同《-1,-2.。。。。》,
然后-num的值就是的岛的个数。
#include<stdio.h>
int a[101][101],book[101][101],m,n,s,sum;
void dfs(int x,int y,int num){
int tx,ty,i;
a[x][y]=num;
int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
for(i=0;i<4;i++){
tx=x+next[i][0];
ty=y+next[i][1];
if(tx<1||tx>m||ty<1||ty>n) continue;
if(book[tx][ty]==0&&a[tx][ty]>0){
book[tx][ty]=1;
sum++;
dfs(tx,ty,num);
}
}
return ;
}
int main(){
int i,j;
int num=0;
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
if(a[i][j]>0){
num--;
sum=1;
book[i][j]=1;
dfs(i,j,num);
}
if(sum>s) s=sum;
}
}
printf("%d",s);
return 0;
}
其实并没有写完