C++——黑白棋(final)

来源:互联网 发布:mysql打印输出语句 编辑:程序博客网 时间:2024/05/16 07:01

黑白棋(final)

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

下面我们来编写黑白棋的一个比较重要的模块,对于某个棋盘状态,我们将要下一个子时,最朴素的考虑就是我下了这个子后棋盘上我方颜色的子尽量的多(如果大家对于黑白棋有一定研究,会发现这样走并不优)。我们这里要求大家编程实现找出可以使我方下完一个子后,棋盘上的我方颜色的子最多的位置,如果有多个这样的位置,请输出行数和列数最小的(优先比较行号,如果行号相同再比较列号)。

输入:

首先读入的是当前棋盘的状态,共8行,每行8个数字,1代表白棋,2代表黑棋,0代表为空格(未下子)。第9行有1个数字N代表将要下子的颜色。

输出:

下子的行号和列号,中间用空格分隔开。如果无法落子,请输出Impossible

输入样例:

0 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 1 2 0 0 00 0 0 2 1 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 01

输出样例:

2 4


#include<iostream>

using namespace std;

void init();
void shang(int m,int n);
void xia(int m,int n);
void zuo(int m,int n);
void you(int m,int n);
void zuoshang(int m,int n);
void youshang(int m,int n);
void zuoxia(int m,int n);
void youxia(int m,int n);

int qipan[8][8];
int zuiduo[8][8]={0};
int color;

int main()
{
 int i,j,k,temp;
 int a[64]={0};

 init();
 k=0;

//遍历可能落子的地方,并将该点(i,j)处的落子后改变的棋子数与与该下棋同色并连线的棋子数之和储存到zuiduo[I][j];

 for(i=0;i<8;i++)
 {
  for(j=0;j<8;j++)
  {
   if(qipan[i][j]==color)
   {
    shang(i,j);
    xia(i,j);
    zuo(i,j);
    you(i,j);
             zuoshang(i,j);
          youshang(i,j);
       zuoxia(i,j);
    youxia(i,j);
   }
  }
 }

//将落子后的棋子数放入a[64],方便比较棋数多少,找出最大值
 for(i=0;i<8;i++)
 {
  for(j=0;j<8;j++)
  {
   if(zuiduo[i][j]!=0)
   {
    a[k]=zuiduo[i][j];
    k++;
   }
  }
 }
 if(a[0]==0)
 {
  cout<<"Impossible"<<endl;
  return 0;
 }
 else
 {

//将最大值放入temp
  temp=a[0];
     for(i=1;i<k;i++)
  {
   if(a[i]>temp)
   {
    temp=a[i];
   }
  }

//找出最大值temp对应的棋盘坐标
  for(i=0;i<8;i++)
  {
   for(j=0;j<8;j++)
   {
    if(temp==zuiduo[i][j])
    {
     cout<<i<<" "<<j<<endl;
     return 0;
    }
   }
  }
 }
}

void init()
{
 int i,j;
 for(i=0;i<8;i++)
 {
  for(j=0;j<8;j++)
  {
   cin>>qipan[i][j];
  }
 }
 cin>>color;
}
void shang(int m,int n)
{
 int i,temp;
 temp=1;
 for(i=m-1;i>=0;i--)
 {
  if(qipan[i][n]!=color&&qipan[i][n]!=0)
  {
   temp++;
  }
  else
  {
   break;
  }
 }
 if(temp>1&&i>=0)
 {
     zuiduo[i][n]+=temp;
 }
}

void xia(int m,int n)
{
 int i,temp;
 temp=1;
 for(i=m+1;i<8;i++)
 {
  if(qipan[i][n]!=color&&qipan[i][n]!=0)
  {
   temp++;
  }
  else
  {
   break;
  }
 }
 if(temp>1&&i>=0)
 {
  zuiduo[i][n]+=temp;
 }
}

void zuo(int m,int n)
{
 int i,temp;
 temp=1;
 for(i=m-1;i>=0;i--)
 {
  if(qipan[m][i]!=color&&qipan[m][i]!=0)
  {
   temp++;
  }
  else
  {
   break;
  }
 }
    if(temp>1&&i>=0)
 {
  zuiduo[m][i]+=temp;
 }
}

void you(int m,int n)
{
 int i,temp;
 temp=1;
 for(i=m+1;i<8;i++)
 {
  if(qipan[m][i]!=color&&qipan[m][i]!=0)
  {
   temp++;
  }
  else
  {
   break;
  }
 }
 if(temp>1&&i>=0)
 {
  zuiduo[m][i]+=temp;
 }
}

void zuoshang(int m,int n)
{
 int i,j,flag,temp;
 flag=0;
 temp=1;
 for(i=m-1;i>=0;i--)
 {
  for(j=n-1;j>=0;j--)
  {
   if(m-i==n-j)
   {
              if(qipan[i][j]!=color&&qipan[i][j]!=0)
              {
             temp++;
           }
              else
           {
       flag=1;
             break;
           }
   }
  }
  if(flag==1)
  {
   break;
  }
 }
 if(temp>1&&i>=0&&j>=0)
 {
  zuiduo[i][j]+=temp;
 }
}

void youshang(int m,int n)
{
 int i,j,flag,temp;
 flag=0;
 temp=1;
 for(i=m-1;i>=0;i--)
 {
  for(j=n+1;j<8;j++)
  {
   if(m-i==j-n)
   {
              if(qipan[i][j]!=color&&qipan[i][j]!=0)
              {
             temp++;
           }
              else
           {
       flag=1;
             break;
           }
   }
  }
  if(flag==1)
  {
   break;
  }
 }
 if(temp>1&&i>=0&&j<8)
 {
  zuiduo[i][j]+=temp;
 }
}

void zuoxia(int m,int n)
{
 int i,j,flag,temp;
 flag=0;
 temp=1;
 for(i=m+1;i<8;i++)
 {
  for(j=n-1;j>=0;j--)
  {
   if(i-m==n-j)
   {
              if(qipan[i][j]!=color&&qipan[i][j]!=0)
              {
             temp++;
           }
              else
           {
       flag=1;
             break;
           }
   }
  }
  if(flag==1)
  {
   break;
  }
 }
 if(temp>1&&i<8&&j>=0)
 {
  zuiduo[i][j]+=temp;
 }
}

void youxia(int m,int n)
{
 int i,j,flag,temp;
 flag=0;
 temp=1;
 for(i=m+1;i<8;i++)
 {
  for(j=n+1;j<8;j++)
  {
   if(i-m==j-n)
   {
              if(qipan[i][j]!=color&&qipan[i][j]!=0)
              {
             temp++;
           }
              else
           {
       flag=1;
             break;
           }
   }
  }
  if(flag==1)
  {
   break;
  }
 }
 if(temp>1&&i<8&&j<8)
 {
  zuiduo[i][j]+=temp;
 }
}


原创粉丝点击