/*
nr100-1_OX 北二區 100年-1 OX連線
*/
#include <iostream>
#include <sstream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int MaxN = 10;
int a[MaxN][MaxN]; //O:0 X:1
int n;
vector<string> out; // 將連線 的起點(x,y)及終點(nx,ny)以四位數 的字串 存入
bool chk(int r,int c,int mr,int mc) // r是y軸座標 c是x軸座標
{
int cnt=0 , nr=r, nc=c;
int ox=a[r][c]; // 第1格的值, 連線需皆相同
for(int i=1;i<n;++i) // 下一格
{
nr+=mr; nc+=mc; // next pos 下一格的座標
if(nr<0 || nr>=n ||nc<0 || nc>=n) break; //超出邊界
if(a[nr][nc] != ox ) return 0; // 連線不成立
++cnt;
}
if(cnt<2) return 0; // 少於3格 連線不成立
nc = c+mc*cnt; nr = r+mr*cnt; //算出終點
// 以下記錄 起點、終點的方式 是因為題目規定最大為 10,
// 0~9可用一位數記錄,若>10就需另外的方式
// 將起點、終點 座標的4位數以字串 形式存入 vecotr 內
string os;
os.push_back(char(c+'0'));
os += char(r+'0');
os += char(nc+'0');
os += char(nr+'0');
out.push_back( os );
return 1; // 有一連線
}
int main( )
{
int t , m , i , j , k;
string s; //一行
cin >> n; getline(cin,s); //用cin讀整數 還留一個換行符號沒讀,需用getline讀入
memset(a,0,sizeof(a)); // 將 a 陣列值清為 0
for(i=0;i<n;++i)
{
getline(cin,s); //讀入一列
istringstream sin(s); // 由字串 代替 cin 讀入
{
while(sin>>j)
{
if(j==0) break; //此行沒有 X
a[i][j-1] = 1; //第j格(索引為j-1) X
}
}
}
// 這是多印出來 檢查用的
for(i=0; i<n; ++i)
{
for(j=0; j<n; ++j)
cout << a[i][j];
cout << endl;
}
int ans=0; //計算連線數
for(i=0;i<n;++i)
{
ans += chk(i,0,0,1); // 橫的 →
ans += chk(0,i,1,0); // 直的 ↓
ans += chk(i,0,-1,1); // 最左欄 斜線由左下 向 右上
ans += chk(i,0,1,1); // 最左欄 斜線由左上 向 右下
}
for(i=1;i<n;++i)
{
ans += chk(n-1,i,-1,1); // 最下列 斜線由左下 向 右上
ans += chk(0,i,1,1); // 最上列 斜線由左上 向 右下
}
// 呼叫所有 chk 的連線檢查後,符合的起點終點 放入 out 內
sort( out.begin(), out.end()); // 排序
cout << out.size() << endl; // 印出個數
for(i=0; i<out.size(); ++i) // 依小至大印出 {雖然題目沒規定}
{
int c=out[i][0]-'0' , r=out[i][1]-'0' , nc=out[i][2]-'0' , nr=out[i][3]-'0';
cout <<'('<< c+1 <<','<< r+1<<")(" << nc+1 <<','<< nr+1 <<")\n";
}
return 0;
}
/*
4
1 4
3 4
4
1 2 3 4
5
1 2 3 4 5
3 4
4 5
1 2 5
0
-------
3
(1,3)(3,1)
(1,4)(4,4)
(4,1)(4,4)
5
(1,1)(5,1)
(1,2)(4,5)
(1,5)(5,5)
(2,1)(5,4)
(3,1)(5,3)
*/
0 意見:
張貼留言