来源:点击打开链接
由于一些原因,需要在短短的一段时间内速成图论和搜索了= =,希望能够有一个不错的结果。
这个题是著名八皇后问题的变种,大意就是问在一个棋盘中,照面的皇后有几组(横着竖着斜着都算)。输入需要仔细看才能看懂,王后的坐标是通过x,y的公式给的,需要算出来然后建图。
二维数组在30000的长度面前会溢出,所以转化成4个一维数组来进行判断,行、列、左上行、右下行都算上。最后总体搜过一遍,得出结果。
#include <iostream> #include <string> #include <cstring> using namespace std; int xline[30002]; int yline[30002]; int Beforex[60002]; int Beforey[60002]; //int point[30002][30002];//超了个界 int main() { int mat; while(cin>>mat && mat!=0) { memset(xline,0,sizeof(xline)); memset(yline,0,sizeof(yline)); memset(Beforex,0,sizeof(Beforex)); memset(Beforey,0,sizeof(Beforey)); int queennum,ans=0; cin>>queennum; for(int i=0;i<=queennum-1;i++) { int k,x,y,s,t; int nowx,nowy; cin>>k>>x>>y>>s>>t; for(int i=0;i<=k-1;i++) { nowx=x+(i*s); nowy=y+(i*t); xline[nowx]++; yline[nowy]++; Beforex[nowx+nowy]++;//左上 Beforey[(mat+nowy)-nowx]++; //右下 } } for(int i=1;i<=mat;i++) { if(xline[i]>1) ans+=xline[i]-1; if(yline[i]>1) ans+=yline[i]-1; } for(int j=1;j<=2*mat;j++) { if(Beforex[j]>1) ans=ans+Beforex[j]-1; if(Beforey[j]>1) ans=ans+Beforey[j]-1; } cout<<ans<<endl; } return 0; }