赞
踩
哇社会真的险恶
这个题
题面给了一大堆东西
还夹杂着没用的设定
加冕这种玩意
只有在进行完一次操作之后才能进行
然而题目要求只能进行一次操作
所以完全就是逗你玩的
题目大意就是
求对单个棋子进行一次操作且吃子最多的方案数
对王和普通棋子单独进行处理
在无法吃子的时候
就求能行动的棋子的行动方案数
漏写了个地方
居然还过了90
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<climits>
#include<queue>
#define LL long long
using namespace std;
int dx[5]={0,-1,-1,1,1},dy[5]={0,1,-1,1,-1};
int tot,maxn,ansx[1005],ansy[1005],pic[15][15];
bool die[15][15],king[15][15];
char c;
bool check(int x,int y,int d)
{
if((pic[x][y]==2)&&(!die[x][y])&&(!pic[x+dx[d]][y+dy[d]])&&(x+dx[d]>=1&&x+dx[d]<=10)&&(y+dy[d]>=1&&y+dy[d]<=10)) return 1;
return 0;
}
bool check2(int x,int y)
{
if((x<=10&&x>=1)&&(y<=10&&y>=1)) return 1;
return 0;
}
void dfs1(int x,int y,int eat,int X,int Y)
{
if(x!=X&&y!=Y)
{
if(eat==maxn)
{
tot++;
ansx[tot]=X;
ansy[tot]=Y;
}
if(eat>maxn)
{
tot=1;
maxn=eat;
ansx[tot]=X;
ansy[tot]=Y;
}
}
int xx,yy,i;
for(i=1;i<=4;i++)
{
xx=x+dx[i];
yy=y+dy[i];
if(check(xx,yy,i))
{
die[xx][yy]=1;
dfs1(xx+dx[i],yy+dy[i],eat+1,X,Y);
die[xx][yy]=0;
}
}
}
void dfs2(int x,int y,int eat,int X,int Y)
{
if(x!=X&&y!=Y)
{
if(eat==maxn)
{
tot++;
ansx[tot]=X;
ansy[tot]=Y;
}
if(eat>maxn)
{
tot=1;
maxn=eat;
ansx[tot]=X;
ansy[tot]=Y;
}
}
int xx,yy,xx0,yy0,i;
for(i=1;i<=4;i++)
{
xx=x+dx[i];
yy=y+dy[i];
while(check2(xx,yy))
{
if(pic[xx][yy]==2)
if(!die[xx][yy])
{
xx0=xx+dx[i];
yy0=yy+dy[i];
while(check2(xx0,yy0))
{
if(!pic[xx0][yy0])
{
die[xx][yy]=1;
dfs2(xx0,yy0,eat+1,X,Y);
die[xx][yy]=0;
}
else break;
xx0+=dx[i];
yy0+=dy[i];
}
break;
}
xx+=dx[i];
yy+=dy[i];
}
}
}
void work()
{
int i,j,k,p,xx,yy;
for(i=1;i<=10;i++)
for(j=1;j<=10;j++)
if(pic[i][j]==1)
{
memset(die,0,sizeof(die));
if(!king[i][j]) dfs1(i,j,0,i,j);
else dfs2(i,j,0,i,j);
}
if(!maxn)
{
tot=0;
for(i=1;i<=10;i++)
for(j=1;j<=10;j++)
if(pic[i][j]==1)
{
if(!king[i][j])
for(k=1;k<=2;k++)
{
xx=i+dx[k];yy=j+dy[k];
if((!pic[xx][yy])&&(check2(xx,yy)))
{
tot++;
ansx[tot]=i;
ansy[tot]=j;
}
}
else
{
for(k=1;k<=4;k++)
for(p=1;p<=9;p++)
{
xx=i+p*dx[k];yy=j+p*dy[k];
if((!pic[xx][yy])&&(check2(xx,yy)))
{
tot++;
ansx[tot]=i;
ansy[tot]=j;
}
else if(pic[xx][yy]) break;
}
}
}
}
return;
}
int main()
{
int i,j;
for(i=1;i<=10;i++)
for(j=1;j<=10;j++)
{
cin>>c;
pic[i][j]=c-'0';
}
for(i=1;i<=10;i++)
for(j=1;j<=10;j++)
{
cin>>c;
king[i][j]=c-'0';
}
work();
printf("%d\n",tot);
for(i=1;i<=tot;i++)
printf("(%d,%d)\n",ansx[i],ansy[i]);
return 0;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。