本文主要是介绍uva141 The Spot Game,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
看网上好多大神都说自己wa了很多次,都是由于审题不仔细,估计他们是看这题太简单了就粗心了吧,由此可见,审题一定要仔细。
不过我竟然一次ac了,好久没这么爽过了,写出来直接交竟然通过了。。。不过毕竟这题简单。
没必要用哈希判重,因为最多50×50=2500个点,2的2500次方=3.7582802345480120368336241897239e+752恐怖吧,用哈希的话不能体现出哈希的优点。其实只用1个100*50*50的数组判重就行了,因为最多就100步,每步最多只能产生一种pattern。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 50
using namespace std;char board[MAX][MAX],vis[MAX*2][MAX][MAX];
int N;int equal(int cur,char board[MAX][MAX])
{int i,j,t,flag;for(i=0;i<cur;i++){flag=1;for(j=0;j<N;j++){for(t=0;t<N;t++)if(vis[i][j][t]!=board[j][t])flag=0;}if(flag==1){return 1;}}return 0;
}void insert(int cur)
{int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++)vis[cur][i][j]=board[i][j];}
}int judge(int cur)
{char help[MAX][MAX];int i,j,t,k,flag;if(equal(cur,board))return 1;for(i=0,t=0;i<N;i++,t++){for(j=0,k=N-1;j<N;j++,k--){help[k][t]=board[i][j];}}if(equal(cur,help))return 1;for(i=0,t=N-1;i<N;i++,t--){for(j=0,k=N-1;j<N;j++,k--){help[t][k]=board[i][j];}}if(equal(cur,help))return 1;for(i=0,t=N-1;i<N;i++,t--){for(j=0,k=0;j<N;j++,k++){help[k][t]=board[i][j];}}if(equal(cur,help))return 1;insert(cur);return 0;
}void solve()
{int i,j,a,b,who,step,flag=0;char ch;memset(board,0,MAX*MAX);for(i=0;i<N*2;i++){scanf("%d %d %c",&a,&b,&ch);if(ch=='+'){board[a-1][b-1]=1;}else if(ch=='-'){board[a-1][b-1]=0;}if(flag==0&&judge(i)){if(i%2==0)who=2;elsewho=1;step=i+1;flag=1;}}if(flag==0)printf("Draw\n");elseprintf("Player %d wins on move %d\n",who,step);
}int main()
{int i,j;while(scanf("%d",&N)&&N){solve();}return 0;
}
这篇关于uva141 The Spot Game的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!