#include <cstdio>//the biggest N of this call-back method is 28(8s)
#include <iostream>
#include <algorithm>
using namespace std;
int col[30];//col[row] seems the col of queen in the row
bool check(int r,int c)
{
int i;
for(i=1;i<r;i++)//make sure all the previous points are not conflict with the current one
if(c==col[i]||(r-i)==abs(c-col[i]))//the cols and diagonal lines
return false;
return true;
}
//I didn't use the optimizing method(fetch the place that costs less squares on the diagonals) mentioned in the class,cause I think it's inconvenient(must use the queue and pointers).
//and by drawing some griddings,I noticed that the places that's more close to the border indeed cost less diagonal squares than those in the center.
//if I want to get the diagonal costing number,for (i,j), sum=min(j,n-i)+min(n-j,n-i);the former is those on left and the latter is on right.and i,j is from 1 to n.
int main()
{
int n;
cin>>n;
int i=1,j;
for(j=1;j<=n;j++)
col[j]=0;//queens haven't been set yet
while(1)
{
if(i==0)//while the col[1](the col of the queen in the 1st row) is more than n,in other words,all the ways have been tried
{
printf("end\n");
return 0;
}
col[i]++;
while(!check(i,col[i])&&col[i]<=n)
col[i]++;//if the col is not suitable,then shift
if(col[i]>n)
{
col[i]=0;//clear the current state
i--;//look back the previous row
continue;
}
if(i==n)//all the queens have been set
{
for(j=1;j<=n;j++)
printf("(%d,%d) ",j,col[j]);
cout<<endl;
return 0;//if a way is found,return immediately
//i=0;//if you want to find all the ways...
}
i++;
}
}