2016年8月3日 星期三

OX連線(C++)

程式碼:


/*
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 意見:

張貼留言