リーチをlizhiにして
for(l = 1;l < MOKU;l++)if(S[l*(MOKU - 1)] == 0){M = l*(MOKU - 1);}
を<=に修正。

#include<stdio.h>
#define X 3
int S[X*X],P[X*X];
int row(int v){int p=0,h=X;while(--h>=0)p+=S[X*v+h];return p;}
int col(int h){int p=0,v=X;while(--v>=0)p+=S[X*v+h];return p;}
int dia(int u){int p=0,j=X,l,m;if(u)l=m=X-1;else l=0,m=X+1;
while(--j>=0)p+=S[m*j+l];return p;}
void checkwsub(int r){if(r==-X){show();puts("\nYou won!\n");exit(2);}
if(r==X){show();puts("\nYou lose!\n");exit(2);}}
void checkwin(){int v=0,r;for(;v<X;)
checkwsub(row(v)),checkwsub(col(v)),checkwsub(dia(v++));}
int lizsub(int i, int z){
if(row(i)==z)for(l=X;--l>=0;)if(!S[X*i+l])return X*i+l;
if(col(i)==z)for(l=X;--l>=0;)if(!S[X*l+i])return X*l+i;
if(dia(0)==z)for(l=X;--l>=0;)if(!S[X*l+l])return X*l+l;
if(dia(1)==z)for(l=1;l<=X;l++)if(!S[X*l-l])return X*l-l;return -1;}
int lizhi(int i){int l=lizsub(i,X-1);if(l==-1)l=lizsub(i,1-X);
return l;}

ロジック変えないと無理だろうと…