您的位置:首页 > 其它

CodeForces Gym 100500A A. Poetry Challenge DFS

2017-02-27 18:02 309 查看

题目链接:

http://codeforces.com/gym/100500/attachments

题意:

文字接龙,谁接不下去了,就算谁输 输出赢家

都很聪明的情况下

题解:

看起来是博弈 不会啊 这个dfs还不懂

qsc ls:转化成图论之后,直接DFS爆搜就好了!

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MS(a) memset(a,0,sizeof(a))
#define MP make_pair
#define PB push_back
const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
inline ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
//////////////////////////////////////////////////////////////////////////
const int maxn = 1e4+10;

int n,m,vis[30],flag;
char s1[11][maxn],s2[11][maxn];
vector<int> e[30];

bool dfs(int x){

for(int i=0; i<(int)e[x].size(); i++){
int v = e[x][i];
if(vis[v]) continue;
vis[v] = 1;
if(!dfs(v)){  // 返回了0 说明对于v 对手已经没有接的了  对当前玩家x来说 是不利的 不能选以v的开头为尾的x
vis[v] = 0;
return 1; // 返回1 对于上一层的这个点是不行的  就要选下一个点(如果有)
}
}

return 0;  // 返回0表示 x的对手没有可以接的了, win
}

int main(){
int T=read();
for(int cas=1; cas<=T; cas++){
for(int i=0; i<=25; i++) e[i].clear();
MS(vis);
flag = 0;
n=read();
for(int i=0; i<n; i++)
gets(s1[i]);
m = read();
for(int i=0; i<m; i++)
gets(s2[i]);
for(int i=0; i<n; i++){
int len = strlen(s1[i]);
for(int j=0; j<m; j++)
if(s1[i][len-1] == s2[j][0])
e[i].push_back(j+9);
}

for(int j=0; j<m; j++){
int len = strlen(s2[j]);
for(int i=0; i<n; i++)
if(s2[j][len-1] == s1[i][0])
e[j+9].push_back(i);
}

for(int i=0; i<n; i++){
vis[i] = 1;
if(!dfs(i)){
flag = 1;
break;
}
vis[i] = 0;
}
if(flag) cout << "Game " << cas << ": player1\n";
else cout << "Game " << cas << ": player2\n";
}

return 0;
}

//http://codeforces.com/gym/100500/attachments
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dfs