|
|
|
|
|
|
这个也是一道DFS的题,比较简单的,不过做DFS的时候我开始采用的一种方式不行,看了DISCUSS,用了位运算的方法,过了。 我把WA的代码贴出来,希望大家看看指点一下WA在哪儿的。我只写了求房间数目的代码,并没有写最大房间的部分代码,问题显然是在DFS中的。
![]() Code #include<stdio.h> #include<string.h> #define max 100 int map[max][max],i,j,m,n; int visited[max][max]; int dic[4][2]={{0,-1},{-1,0},{0,1},{1,0}}; int str[4];
int in(int x,int y) { if(x>0&&y>0&&x<=m&&y<=n) return 1; else return 0; }
void DFS(int x,int y) { int k,swap,num=0; memset(str,0,sizeof(str)); swap=map[x][y]; while(swap){ str[num]=swap%2; swap=(swap-str[num])/2; num++; } visited[x][y]=1; for(k=0;k<4;k++){ if(!visited[x+dic[k][0]][y+dic[k][1]]&&(str[k]==0)&&(in(x+dic[k][0],y+dic[k][1]))) DFS(x+dic[k][0],y+dic[k][1]); } }
int begin() { int count=0; for(i=1;i<=m;i++) for(j=1;j<=n;j++) if(!visited[i][j]){ count++; DFS(i,j); } return count; }
int main() { while(scanf("%d%d",&m,&n)!=EOF&&m&&n){ for(i=1;i<=m;i++) for(j=1;j<=n;j++){ scanf("%d",&map[i][j]); visited[i][j]=0; } printf("%d\n",begin()); } return 0; }
我输出了以后得到的错误是这样的。前面的都可以,(1,1),(1,2)。。。。。。一直到(1,5),然后向右遍历,(1,6),(1,7),(2,7),(3,7),(4,7)。到了这儿了函数应该回溯到(1,5)吧,然后再K++,指向南边,再遍历,可我的DFS就直接跳到BEGIN去了,大家可以试试的。就是这儿不明白的了。纠结了一下午。
|
|