又是黑白棋
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
相信同学已经对黑白棋了如指掌了,最为一个黑白棋高手,一定知道黑白棋棋盘上的各个位置的重要性是完全不同的,如4个角最为重要,其次是边,中间的位置重要性最低。那么我们这里引入一个权值矩阵,里面存有各个位置的重要性的权值。在我们下棋时首要考虑当前我方下完棋后,我方颜色的棋子所占位置的重要性大于对方,这里我们取权值的差值作为目标值(即我方重要性的和减去对方重要性的和)。此题要求同学在给出的棋盘状态下找出对于某种颜色,可使目标值最大的点。如果有多个这样的位置,请输出行数和列数最小的(优先比较行号,如果行号相同再比较列号)。
输入:
首先读入的是当前棋盘的状态,共8行,每行8个数字,1代表白棋,2代表黑棋,0代表为空格(未下子)。第9行有1个数字N代表将要下子的颜色。第10-17行是位置重要性矩阵,每行8个数字。
输出:
下子的行号和列号,中间用空格分隔开。如果无法落子,请输出Impossible
输入样例:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
输出样例:
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 valu[8][8]; int really_valu[8][8]={0}; int color;
int main() { int i,j,k,temp; int a[64]={0};
init(); k=0;
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); } } } for(i=0;i<8;i++) { for(j=0;j<8;j++) { if(really_valu[i][j]!=0) { a[k]=really_valu[i][j]; k++; } } } if(a[0]==0) { cout<<"Impossible"<<endl; return 0; } else { temp=a[0]; for(i=1;i<k;i++) { if(a[i]>temp) { temp=a[i]; } } for(i=0;i<8;i++) { for(j=0;j<8;j++) { if(temp==really_valu[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; for(i=0;i<8;i++) { for(j=0;j<8;j++) { cin>>valu[i][j]; } } } void shang(int m,int n) { int i,temp,counter; counter=1; for(i=m-1;i>=0;i--) { if(qipan[i][n]!=color&&qipan[i][n]!=0) { counter++; } else { break; } } temp=i; if(counter>1&&temp>=0) { if(really_valu[temp][n]==0) { really_valu[temp][n]=valu[temp][n]; } for(i=m-1;i>temp;i--) { really_valu[temp][n]+=valu[i][n]; } } }
void xia(int m,int n) { int i,temp,counter; counter=1; for(i=m+1;i<8;i++) { if(qipan[i][n]!=color&&qipan[i][n]!=0) { counter++; } else { break; } } temp=i; if(counter>1&&temp<8) { if(really_valu[temp][n]==0) { really_valu[temp][n]=valu[temp][n]; } for(i=m+1;i<temp;i++) { really_valu[temp][n]+=valu[i][n]; } } }
void zuo(int m,int n) { int i,temp,counter; counter=1; for(i=n-1;i>=0;i--) { if(qipan[m][i]!=color&&qipan[m][i]!=0) { counter++; } else { break; } } temp=i; if(counter>1&&temp>=0) { if(really_valu[m][temp]==0) { really_valu[m][temp]=valu[m][temp]; } for(i=n-1;i>temp;i--) { really_valu[m][temp]+=valu[m][i]; } } }
void you(int m,int n) { int i,temp,counter; counter=1; for(i=n+1;i<8;i++) { if(qipan[m][i]!=color&&qipan[m][i]!=0) { counter++; } else { break; } } if(counter>1&&temp<8) { if(really_valu[m][temp]==0) { really_valu[m][temp]=valu[m][temp]; } for(i=n+1;i<temp;i++) { really_valu[m][temp]+=valu[m][i]; } } }
void zuoshang(int m,int n) { int i,j,flag,temp1,temp2,counter; flag=0; counter=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) { counter++; } else { flag=1; break; } } } if(flag==1) { break; } } temp1=i; temp2=j; if(counter>1&&temp1>=0&&temp2>=0) { if(really_valu[temp1][temp2]==0) { really_valu[temp1][temp2]=valu[temp1][temp2]; } for(i=m-1;i>temp1;i--) { for(j=n-1;j>temp2;j--) { if(m-i==n-j) { really_valu[temp1][temp2]+=valu[i][j]; } } } } }
void youshang(int m,int n) { int i,j,flag,temp1,temp2,counter; flag=0; counter=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) { counter++; } else { flag=1; break; } } } if(flag==1) { break; } } temp1=i; temp2=j; if(counter>1&&temp1>=0&&temp2<8) { if(really_valu[temp1][temp2]==0) { really_valu[temp1][temp2]=valu[temp1][temp2]; } for(i=m-1;i>temp1;i--) { for(j=n+1;j<temp2;j++) { if(m-i==j-n) { really_valu[temp1][temp2]+=valu[i][j]; } } } } }
void zuoxia(int m,int n) { int i,j,flag,temp1,temp2,counter; flag=0; counter=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) { counter++; } else { flag=1; break; } } } if(flag==1) { break; } } temp1=i; temp2=j; if(counter>1&&temp1<8&&temp2>=0) { if(really_valu[temp1][temp2]==0) { really_valu[temp1][temp2]=valu[temp1][temp2]; } for(i=m+1;i<temp1;i++) { for(j=n-1;j>temp2;j--) { if(i-m==n-j) { really_valu[temp1][temp2]+=valu[i][j]; } } } } }
void youxia(int m,int n) { int i,j,flag,temp1,temp2,counter; flag=0; counter=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) { counter++; } else { flag=1; break; } } } if(flag==1) { break; } } if(counter>1&&temp1<8&&temp2<8) { if(really_valu[temp1][temp2]==0) { really_valu[temp1][temp2]=valu[temp1][temp2]; } for(i=m+1;i<temp1;i++) { for(j=n+1;j<temp2;j++) { if(i-m==j-n) { really_valu[temp1][temp2]+=valu[i][j]; } } } } }