AOJ 0183 - Black-and-White

これは長いなと思っていたら,意外と短いほうだった.
しかし,納得の行かないコード

#include <iostream>
using namespace std;
int main(){
	string m[3];
	while(std::cin >> m[0], m[0][0] != '0'){
		for(int i=1;i<3;i++)std::cin >> m[i];
		string w = "NA";
		for(int i=0;i<3;i++){
			if(m[i][0] == m[i][1] && m[i][0] == m[i][2])
				if(m[i][0] != '+')w = m[i][0];
			if(m[0][i] == m[1][i] && m[0][i] == m[2][i])
				if(m[0][i] != '+')w = m[0][i];
		}
		if(m[0][0] == m[1][1] && m[0][0] == m[2][2])
			if(m[0][0] != '+')w = m[0][0];
		if(m[0][2] == m[1][1] && m[0][2] == m[2][0])
			if(m[0][2] != '+')w = m[0][2];
		
		std::cout << w << std::endl;
	}
}
<||

短くしてみたが,無駄なように感じられる.
>|cpp|
#include <iostream>

int main(){
	std::string m[3], w;
	while(std::cin >> m[0], m[0][0] != '0'){
		for(int i=1;i<3;i++)std::cin >> m[i];
		w = "NA";
		char c;
		for(int i=0;i<3;i++){
			c = m[i][0];
			if(2*c - m[i][1] - m[i][2] == 0 && c - '+')w = c;
			c = m[0][i];
			if(2*c - m[1][i] - m[2][i] == 0 && c - '+')w = c;
		}
		c = m[0][0];
		if(2*c - m[1][1] - m[2][2] == 0 && c - '+')w = c;
		c = m[0][2];
		if(2*c - m[1][1] - m[2][0] == 0 && c - '+')w = c;
		
		std::cout << w << '\n';
	}
}