zju 2100 Seeding(dfs暴搜)

来源:互联网 发布:天融信应届生工资 知乎 编辑:程序博客网 时间:2024/05/18 02:45

感觉这题就像是在判断给你的这个图是不是半欧拉图,

判断图G是欧拉图当且仅当G为连通图,且所有点度为偶数。

判断图G是半欧拉图当且仅当G为连通图,且当且仅当2个点度数为奇数。

欧拉图也是半欧拉图。

但是,从里理论上来说,可以做出来,还要用并查集判断是否连接,感觉繁了点,不过,时间应该要比DFS的少,速度要快。

但是由于本来很懒,很懒,所以只是提出建议,可以这样做,自己做了一下,感觉可以,就不做了。

附上DFS代码:

#include<iostream>#include<cstring>using namespace std;#define MAX_N 10char map[MAX_N][MAX_N];bool use[MAX_N][MAX_N],succeed;int n,m,numstones,numseed;void Init(){memset(map,'S',sizeof(map));memset(use,false,sizeof(use));numstones=0;succeed=false;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>map[i][j];if(map[i][j]=='S')numstones++;}numseed=n*m-numstones;}bool dfs(int x,int y,int k){if(map[x][y]=='S' || use[x][y])return false;use[x][y]=true;if(succeed || k==1 || dfs(x+1,y,k-1)||dfs(x-1,y,k-1)||dfs(x,y+1,k-1)||dfs(x,y-1,k-1)){succeed=true;return true;}use[x][y]=false;return false;}int main(){while(cin>>n>>m && n&& m){Init();dfs(1,1,numseed)?cout<<"YES"<<endl:cout<<"NO"<<endl;}return 0;}