#include<iostream>
#include<list>
#include<string>
#include<cstring>
#include<sstream>
#include<cctype>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<stack>
#include<fstream>
#include<cstdlib>
#include<vector>
#include<map>
#include<set>
#include<utility>
#include<iomanip>
#include<queue>
using namespace std;
#define INF (1<<29)
#define SET(a) memset(a,-1,sizeof(a))
#define ALL(a) a.begin(),a.end()
#define CLR(a) memset(a,0,sizeof(a))
#define FILL(a,v) memset(a,v,sizeof(a))
#define PB push_back
#define FOR(i,n) for(int i = 0;i<n;i++)
#define PI acos(-1.0)
#define EPS 1e-9
#define MP(a,b) make_pair(a,b)
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define READ(f) freopen(f, "r", stdin)
#define WRITE(f) freopen(f, "w", stdout)
#define LL long long
#define MX 100000
#define MOD 1000000007
vector<string>result;
int tmp[10];
string s;
int lft[20],rgt[20],row[10],max_sol; //bottom left diagonal and bottom right diagonal, it can be -8 to +8
void solutions(int n) //all solutions return with string vector result
{
if(n==8)
{
s="";
for(int j=0;j<8;j++)
{
s+= (tmp[j]+'0');
}
result.PB(s);
return;
}
for(int i=1;i<=8;i++)
if(!row[i] && !lft[n+i] && !rgt[n-i+8])//if not visited
{
row[i]=lft[n+i]=rgt[n-i+8]=1;//set visit
tmp[n]=i;
solutions(n+1);
row[i]=lft[n+i]=rgt[n-i+8]=0;
}
}
int main()
{
solutions(0);
//cout<<result[0]<<endl;
int len=result.size();
int t,x,y;
cin>>t;
for(int i=1;i<=t;i++)
{
cin>>x>>y;
if(i!=1)
cout<<endl;
int kk=1;
cout << "SOLN COLUMN" << endl;
cout << " # 1 2 3 4 5 6 7 8" << endl<<endl;
for(int j=0;j<len;j++)
if(result[j][y-1]== x+'0')
{
cout<<setw(2)<<kk++<<" ";
for(int k=0;k<8;k++)
cout<<" "<<result[j][k];
cout<<endl;
}
}
return 0;
}
No comments:
Post a Comment