#include <iostream>
using namespace std;
const int m=10, n=10, max_lev=6, INF=(1<<24);
struct STATE {
int s[m][n], num[n];
STATE() {
for (int i=0;i<m;i++)
for (int j=0;j<n;j++)
s[i][j]=-1;
for (int j=0;j<n;j++)
num[j]=0;
}
bool add(const bool p,const int col) {
if ((col<0)||(col>=n))
return false;
if (num[col]==m)
return false;
s[num[col]][col]=p;
num[col]++;
return true;
}
void remove(const int col) {
num[col]--;
s[num[col]][col]=-1;
return;
}
bool game_over(const int row,const int col) const {
int my_num;
my_num=0;
for (int i=0;(i<4)&&((row+i)<m)&&((col-i)>=0);i++) {
if (s[row+i][col-i]!=s[row][col])
break;
my_num++;
}
for (int i=-1;(i>-4)&&((row+i)>=0)&&((col-i)<n);i--) {
if (s[row+i][col-i]!=s[row][col])
break;
my_num++;
}
if (my_num>=4)
return true;
my_num=0;
for (int i=0;(i<4)&&((row+i)<m);i++) {
if (s[row+i][col]!=s[row][col])
break;
my_num++;
}
for (int i=-1;(i>-4)&&((row+i)>=0);i--) {
if (s[row+i][col]!=s[row][col])
break;
my_num++;
}
if (my_num>=4)
return true;
my_num=0;
for (int i=0;(i<4)&&((row+i)<m)&&((col+i)<n);i++) {
if (s[row+i][col+i]!=s[row][col])
break;
my_num++;
}
for (int i=-1;(i>-4)&&((row+i)>=0)&&((col+i)>=0);i--) {
if (s[row+i][col+i]!=s[row][col])
break;
my_num++;
}
if (my_num>=4)
return true;
my_num=0;
for (int i=0;(i<4)&&((col+i)<n);i++) {
if (s[row][col+i]!=s[row][col])
break;
my_num++;
}
for (int i=-1;(i>-4)&&((col+i)>=0);i--) {
if (s[row][col+i]!=s[row][col])
break;
my_num++;
}
if (my_num>=4)
return true;
return false;
}
bool game_over(const int col) const {
return game_over(num[col]-1,col);
}
int find_val(const int k) const {
return (k*k);
}
int my_check_row(const int p,const int row,const int col) const {
int my_ans=0, my_opponent=1-p, num_all, num_full;
num_full=0;
for (num_all=0;(num_all<4)&&((row+num_all)<m)&&((col-num_all)>=0);num_all++) {
if (s[row+num_all][col-num_all]==my_opponent)
break;
if (s[row+num_all][col-num_all]!=-1)
num_full++;
}
if (num_all==4)
my_ans+=find_val(num_full);
num_full=0;
for (num_all=0;(num_all<4)&&((row+num_all)<m);num_all++) {
if (s[row+num_all][col]==my_opponent)
break;
if (s[row+num_all][col]!=-1)
num_full++;
}
if (num_all==4)
my_ans+=find_val(num_full);
num_full=0;
for (num_all=0;(num_all<4)&&((row+num_all)<m)&&((col+num_all)<n);num_all++) {
if (s[row+num_all][col+num_all]==my_opponent)
break;
if (s[row+num_all][col+num_all]!=-1)
num_full++;
}
if (num_all==4)
my_ans+=find_val(num_full);
num_full=0;
for (num_all=0;(num_all<4)&&((col+num_all)<n);num_all++) {
if (s[row][col+num_all]==my_opponent)
break;
if (s[row][col+num_all]!=-1)
num_full++;
}
if (num_all==4)
my_ans+=find_val(num_full);
return my_ans;
}
int rows() const {
int my_ans=0;
for (int i=0;i<m;i++)
for (int j=0;j<n;j++)
my_ans+=(my_check_row(0,i,j)-my_check_row(1,i,j));
return my_ans;
}
int central_col() const {
int my_ans=0, col =n/2;
for (int i=0;i<num[col];i++) {
if (i<(m/2))
my_ans+=((1-2*s[i][col])*(i+1));
else
my_ans+=((1-2*s[i][col])*(m-i));
}
return my_ans;
}
int h() {
//return rows();
//return (rows()+central_col());
return ((2*rows())+central_col());
}
int best_movement(const bool p,const int lev,const int alpha,const int beta) {
if (lev==0) {
return h();
}
int my_ans=0, my_inf=(INF*((p)?-1:1)), temp_h, ab[2]={alpha,beta};
bool find_my_ans=false;
for (int j=0;j<n;j++)
if (add(p,j)) {
if (game_over(j))
temp_h=my_inf;
else
temp_h=best_movement(!p,lev-1,ab[0],ab[1]);
remove(j);
if (temp_h==my_inf)
return my_inf;
if ((temp_h<ab[p])==p)
ab[p]=temp_h;
if (ab[1]<ab[0])
return ab[p];
if ((!find_my_ans)||((temp_h<my_ans)==p)) {
my_ans=temp_h;
find_my_ans=true;
}
}
return my_ans;
}
int move(const bool p,const int t) {
int my_ans=0, my_ind=-1, temp_h, ab[2]={-INF,INF};
bool find_my_ans=false;
for (int j=0;j<n;j++)
if (add(p,j)) {
if (game_over(j))
return j;
else
temp_h=best_movement(!p,max_lev+((t/n)*((t/n)+1)),ab[0],ab[1]);
remove(j);
if ((temp_h<ab[p])==p)
ab[p]=temp_h;
if ((!find_my_ans)||((temp_h<my_ans)==p)) {
my_ans=temp_h;
find_my_ans = true;
my_ind = j;
}
}
add(p,my_ind);
return my_ind;
}
void show(ostream & out) const {
for (int i=m-1;i>=0;i--) {
for (int j=0;j<n;j++)
if (s[i][j]==-1)
out<<'-'<<' ';
else
out<<((s[i][j])?'X':'O')<<' ';
out<<endl;
}
return;
}
} cur;
ostream & operator << (ostream & out,const STATE & state) {
state.show(out);
return out;
}
int main() {
int temp_player, col;
cin>>temp_player;
bool player=(temp_player-1);
for (int k=0;k<(n*m);k++) {
if ((k%2)==player) {
cerr<<"your move :"<<endl;
while(true) {
cin>>col;
col--;
if (cur.add(player,col))
break;
cerr<<"impossible movement !"<<endl;
}
} else {
cerr<<"thinking ..."<<endl;
col=cur.move(!player,k/2);
cout<<col+1<<endl;
}
cerr<<endl<<cur<<endl;
if (cur.game_over(col)) {
cerr<<"Game over !"<<endl;
if ((k%2)==player)
cerr<<"You win !"<<endl;
else
cerr<<"I win !"<<endl;
return 0;
}
}
cerr<<"It's a draw !"<<endl;
return 0;
}