下面是三题的代码:
/************************************************************** Problem: 2463 User: //不告诉你 Language: C++ Result: Accepted Time:20 ms Memory:1288 kb ****************************************************************/ #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int main() { int n; while (1) { scanf("%d",&n); if (n==0) break; if ((n*n)&1) printf("Bob\n"); else printf("Alice\n"); } return 0; } /************************************************************** Problem: 1443 User: //不告诉你 Language: C++ Result: Accepted Time:264 ms Memory:1960 kb ****************************************************************/ #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define maxn 10100 struct node { int x,y,next; }a[maxn*4];int len,first[maxn]; int bf[maxn],ask[maxn],tim; int map[110][110];bool as[maxn]; void ins(int x,int y) { len++;a[len].x=x;a[len].y=y; a[len].next=first[x];first[x]=len; } bool ffind(int x) { for (int i=first[x];i!=-1;i=a[i].next) if (ask[a[i].y]!=tim) { int y=a[i].y; ask[y]=tim; if (bf[y]==-1 || ffind(bf[y])) { bf[y]=x;bf[x]=y; return true; } } return false; } void dfs(int x) { as[x]=true; for (int i=first[x];i!=-1;i=a[i].next) if (!as[bf[a[i].y]]) dfs(bf[a[i].y]); } int main() { int n,m,num,ans,i,j;char c; scanf("%d%d",&n,&m); num=len=0;memset(first,-1,sizeof(first)); for (i=1;i<=n;i++) { scanf("\n"); for (j=1;j<=m;j++) { scanf("%c",&c); if (c=='#') map[i][j]=0; else map[i][j]=++num; } } for (i=1;i<=n;i++) for (j=1;j<=m;j++) if (map[i][j]) { if (i<n && map[i+1][j]) {ins(map[i][j],map[i+1][j]);ins(map[i+1][j],map[i][j]);} if (j<m && map[i][j+1]) {ins(map[i][j],map[i][j+1]);ins(map[i][j+1],map[i][j]);} } tim=ans=0; memset(bf,-1,sizeof(bf)); memset(ask,0,sizeof(ask)); for (i=1;i<=num;i++) { if (bf[i]==-1) { tim++; if (ffind(i)) ans++; } as[i]=false; } if (ans*2==num) printf("LOSE\n"); else { for (i=1;i<=num;i++) if (bf[i]==-1) { dfs(i); } printf("WIN\n"); for (i=1;i<=n;i++) for (j=1;j<=m;j++) if (map[i][j]) { if (as[map[i][j]]) printf("%d %d\n",i,j); } } return 0; } /************************************************************** Problem: 2437 User: //不告诉你 Language: C++ Result: Accepted Time:20 ms Memory:1440 kb ****************************************************************/ #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define maxn 2100 struct node { int x,y,next; }a[maxn*4];int len,first[maxn]; int num[50][50],sum; bool del[maxn],map[50][50],ret[maxn]; int ans,as[maxn],bf[maxn],ask[maxn],tim; void ins(int x,int y) { ++len;a[len].x=x;a[len].y=y; a[len].next=first[x];first[x]=len; } bool ffind(int x) { if (del[x]) return false; for (int i=first[x];i!=-1;i=a[i].next) if (ask[a[i].y]!=tim) { int y=a[i].y; ask[y]=tim; if (del[y]) continue; if (bf[y]==-1 || ffind(bf[y])) { bf[y]=x; bf[x]=y; return true; } } return false; } int main() { int n,m,i,j,x,y,q;char c; scanf("%d%d",&n,&m); for (i=1;i<=n;i++) { scanf("\n"); for (j=1;j<=m;j++) { scanf("%c",&c); if (c=='X') map[i][j]=1; else if (c=='O') map[i][j]=0; else if (c=='.') {x=i,y=j;map[i][j]=1;} } } sum=len=0; memset(del,0,sizeof(del)); memset(first,-1,sizeof(first)); memset(num,0,sizeof(num)); for (i=1;i<=n;i++) for (j=1;j<=m;j++) if ((map[i][j] && ((abs(x-i)+abs(y-j))&1)==0) || (!map[i][j] && (abs(x-i)+abs(y-j))&1)) num[i][j]=++sum; for (i=1;i<=n;i++) for (j=1;j<=m;j++) if (num[i][j]) { if (i<n && num[i+1][j]) ins(num[i][j],num[i+1][j]); if (i>1 && num[i-1][j]) ins(num[i][j],num[i-1][j]); if (j<m && num[i][j+1]) ins(num[i][j],num[i][j+1]); if (j>1 && num[i][j-1]) ins(num[i][j],num[i][j-1]); } tim=0;memset(bf,-1,sizeof(bf)); memset(ask,0,sizeof(ask)); for (i=1;i<=sum;i++) if (bf[i]==-1) { tim++;ffind(i); } scanf("%d",&q);q<<=1; ans=0;memset(as,0,sizeof(as)); for (i=1;i<=q;i++) { del[num[x][y]]=true; if (bf[num[x][y]]!=-1) { int tt=bf[num[x][y]]; bf[tt]=bf[num[x][y]]=-1; tim++; ret[i]=!ffind(tt); //如果成功增广,就说明那个点不一定在最大匹配上,就是必败态 }else { ret[i]=false;//操作前就是必败了 } scanf("%d%d",&x,&y); } for (i=1;i<=q;i+=2) if (ret[i] && ret[i+1]) as[++ans]=(i+1)/2; printf("%d\n",ans); for (i=1;i<=ans;i++) printf("%d\n",as[i]); return 0; }转载于:https://www.cnblogs.com/Euryale-Rose/p/6527799.html