zoj 2412 dfs

#include<stdio.h>
char jk[55][55];
int dir[4][2]= {{-1,0},{1,0},{0,-1},{0,1}};
int flag[55][55];
int m,n;
void dfs(int x,int y)
{                   //注意这里比较蛋疼,m,n刚好和x,y坐标是相反的。 规律是所在的点和接下来要搜索的点必须相接才行。
    flag[x][y]=1;
    if(x!=0&&jk[x-1][y]!='A'&&jk[x-1][y]!='B'&&jk[x-1][y]!='F'&&jk[x-1][y]!='G'&&flag[x-1][y]!=1
        &&jk[x][y]!='C'&&jk[x][y]!='D'&&jk[x][y]!='F'&&jk[x][y]!='I')
         dfs(x-1,y);
     if(x!=m-1&&jk[x+1][y]!='C'&&jk[x+1][y]!='D'&&jk[x+1][y]!='F'&&jk[x+1][y]!='I'&&flag[x+1][y]!=1
        &&jk[x][y]!='A'&&jk[x][y]!='B'&&jk[x][y]!='F'&&jk[x][y]!='G')
         dfs(x+1,y);
     if(y!=n-1&&jk[x][y+1]!='B'&&jk[x][y+1]!='D'&&jk[x][y+1]!='E'&&jk[x][y+1]!='J'&&flag[x][y+1]!=1
        &&jk[x][y]!='A'&&jk[x][y]!='C'&&jk[x][y]!='E'&&jk[x][y]!='H')
         dfs(x,y+1);
     if(y!=0&&jk[x][y-1]!='C'&&jk[x][y-1]!='A'&&jk[x][y-1]!='E'&&jk[x][y-1]!='H'&&flag[x][y-1]!=1
        &&jk[x][y]!='B'&&jk[x][y]!='D'&&jk[x][y]!='E'&&jk[x][y]!='J')
         dfs(x,y-1);
    return ;
}
int main()
{
    //freopen("input.txt","r",stdin);
    int num,i,j;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        if(m<0||n<0)
            break;
        num=0;
        for(i=0; i<m; i++)
            for(j=0; j<n; j++)
            {
                scanf(" %c",&jk[i][j]);  //    for(i=0;i<n;i++)     scanf("%s",jk[i]);
                flag[i][j]=0;
            }
        for(i=0; i<m; i++)
            for(j=0; j<n; j++)
            {
                if(flag[i][j]==0)
                {
                    num++;
                    dfs(i,j);
                }
            }
        printf("%d\n",num);
    }
    return 0;
}
时间: 2025-01-27 17:55:00

zoj 2412 dfs的相关文章

zoj 2110 DFS

// zoj 2110 #include<stdio.h> #include<math.h> char map[9][9]; int m,n,t; int di,dj; bool escape; int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; void dfs(int si,int sj,int cnt) { int i,temp; if(si>n||sj>m||si<=0||sj<=0) return ; if(si=

zoj 1709 dfs

#include<stdio.h> char jk[101][101]; int m,n; int dir[8][2]={{-1,-1},{-1,0},{-1,1}, {0,1},{0,-1},{1,1},{1,-1},{1,0}}; void dfs(int x,int y) { int i,xx,yy; jk[x][y]='*'; for(i=0;i<8;i++) { xx=x+dir[i][0]; yy=y+dir[i][1]; if(xx<0||yy<0||xx>

zoj 2165 dfs

#include<stdio.h> int dir[4][2]= {{-1,0},{1,0},{0,-1},{0,1}}; char jk[25]; int flag[25][25]; int num; void dfs(int x,int y) { int i,j,xx,yy; for(i=0; i<4; i++) for(j=0; j<4; j++) { xx=x+dir[i][0]; yy=y+dir[i][1]; if(flag[xx][yy]==0) { num++; f

zoj 1008 DFS

#include<stdio.h> int n,q; int jk[25][4]; int state[25]; int result[25]; void initial() { int i,j; for(i=0; i<25; i++) { for(j=0; j<4; j++) jk[i][j]=0; state[i]=0; result[i]=0; } q=0; } int dfs(int ipos) { int i; if(ipos==n*n) return 1; else {

算法:zoj 3201 Tree of Tree(树形背包dp)

题意 给一棵节点带权的树,找到一个有k个节点的子树,求这个子树的最大权值 思路 树形 dp+背包. f(i, j) 表示以i为根节点的有j个节点子树的最大权值 然后对i的每个子节点做分组背包, 因为对于i的每个儿子,可以选择分配 1,2,3...j-1个节点给它 f(i, j) = max{ max{f(i, j-p) + f(v, p) | 1<=p<j} | v是i的儿子节点} ans = max{ f[i][k] | 0<=i<n && i 子树节点个数>

ZOJ和PKU 题目分类

ZOJ题目分类初学者题: 1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 1334 1337 1338 1350 1365 1382 1383 1394 1402 1405 1414 1494 1514 1622 1715 1730 1755 1760 1763 1796 1813 1879 1889 1904 1915 1949 2001 2022 2099 2104 21

uva 10422 - Knights in FEN ID+dfs

10422 - Knights in FEN        经典的棋盘类问题,移动骑士到达指定状态,最少要几次,如果超过10次则输出Unsolvable in less than 11 move(s).        一开始想bfs的,但是状态量比较大,又懒得写hash,又想到了最坏情况,也就是超出10次时,dfs和bfs复杂度都一样,于是就果断用了ID+dfs,编程难度非常低.      不用加剪枝就可以过了,我的代码里加了个最优下限,这样不用每次从0开始进行ID,刚有想到可以利用当前最优情况

hdu4751Divide Groups(dfs枚举完全图集合或者bfs染色)

/************************************************************************* > File Name: j.cpp > Author: HJZ > Mail: 2570230521@qq.com > Created Time: 2014年08月28日 星期四 12时26分13秒 *******************************************************************

迷宫求解非递归 DFS BFS(应用栈和队列)

栈和队列的应用对迷宫问题求解 没有递归 自己手动建的栈和队 并且输出路径 DFS的路径就是 栈中的坐标 BFS的路径在队又开了一个域存上一层的base值 语言还是用的C++ 感觉比C的封装性好很多 充分体会了一下DFS一边比BFS快 但是BFS是最优解而DFS可能不是最优解   #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace