BUCT Coder 2166 : 五子棋

来源:互联网 发布:网络控制器 编辑:程序博客网 时间:2024/05/20 02:23

题目链接   BUCT Coder 2166    

2166: 五子棋

时间限制1Sec  内存限制128 MB
提交68  解决9
[提交
][状态][论坛]

题目描述

在一个1010列的棋盘上,有四颗棋子,需要你再增加一颗棋子,使得这五颗棋子连成一条连续的直线。

输入

输入包含一组测试数据,包括四行,每行是两个整数ij0<=i,j<=9),分别表示棋子的行和列。

输入保证再增加的棋子只有放在一个唯一的位置才能连成一条连续的直线

输出

输出包括一行,两个整数,表示增加的棋子的行和咧

样例输入

0 0

0 1

0 3

0 4

样例输出

0 2

 

题目很简单,先判断所给的点是属于哪一种情况,(1)同一行(2)同一列(3)同一主对角线(4)同一副对角线。然后穷举所属状态的每一种状态即可。


#define LOCAL#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>using namespace std;int ansx,ansy;bool comp(int a,int b){return a<b;}bool IsIn(int a,int Arry[]){for(int i=0;i<4;i++){if(Arry[i]==a){return 1;break;}}return 0;}bool IsInAline(int a[])//是不是一行{bool Flag=1;sort(a,a+5,comp);for(int i=1;i<5;i++){if(a[i]!=a[i-1]+1){Flag=0;break;}}return Flag;}void GetAnsFromXorY(int a[],int Flag)//从行或列中寻找答案{int temp[5];int res;for(int i=0;i<10;i++){if(IsIn(i,a)) continue;memcpy(temp,a,sizeof(int)*4);temp[4]=i;if(IsInAline(temp)){res=i;break;}}if(Flag==0) ansy=res;if(Flag==1) ansx=res;cout<<ansx<<" "<<ansy<<endl;}void GetAnsFromXandY(int x[],int y[],int Flag)//从对角线找答案{int dp=y[0]-x[0];//主对角线int sum=x[0]+y[0];//副对角线int tempx[5],tempy[5];for(int i=0;i<10;i++){int j;if(Flag==2)j=i+dp;if(Flag==3)j=sum-i;if( IsIn(i,x)  || IsIn(j,y)) continue;memcpy(tempx,x,sizeof(int)*4);memcpy(tempy,y,sizeof(int)*4);tempx[4]=i;tempy[4]=j;if(IsInAline(tempx) && IsInAline(tempy)){ansx=i;ansy=j;break;}}cout<<ansx<<" "<<ansy<<endl;}int main(){#ifdef LOCALfreopen("test.txt","r",stdin);freopen("tested.txt","w",stdout);#endifint x[4],y[4];for(int i=0;i<4;i++)cin>>x[i]>>y[i];if(x[0]==x[1]){ansx=x[0];GetAnsFromXorY(y,0);}else if(y[0]==y[1]){ansy=y[0];GetAnsFromXorY(x,1);}else if(x[1]-x[0]==y[1]-y[0]){GetAnsFromXandY(x,y,2);}else if(x[0]+y[0]==x[1]+y[1]){GetAnsFromXandY(x,y,3);}return 0;}

 

0 0
原创粉丝点击